HDLRuby 2.4.27 → 2.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/HDLRuby/drivers/xcd.rb +79 -0
- data/lib/HDLRuby/drivers/xcd/dummy.xcd +4 -0
- data/lib/HDLRuby/hdr_samples/adder.rb +1 -1
- data/lib/HDLRuby/hdr_samples/adder_bench.rb +1 -1
- data/lib/HDLRuby/hdr_samples/adder_gen.rb +1 -1
- data/lib/HDLRuby/hdr_samples/constant_in_function.rb +27 -0
- data/lib/HDLRuby/hdr_samples/dff_properties.rb +19 -0
- data/lib/HDLRuby/hdr_samples/dff_unit.rb +54 -0
- data/lib/HDLRuby/hdr_samples/huge_rom.rb +25 -0
- data/lib/HDLRuby/hdr_samples/logic_bench.rb +21 -0
- data/lib/HDLRuby/hdr_samples/mei8_bench.rb +1 -1
- data/lib/HDLRuby/hdr_samples/music.rb +79 -0
- data/lib/HDLRuby/hdr_samples/named_sub.rb +42 -0
- data/lib/HDLRuby/hdr_samples/rom.rb +16 -0
- data/lib/HDLRuby/hdr_samples/seqpar_bench.rb +59 -0
- data/lib/HDLRuby/hdr_samples/with_function_generator.rb +25 -0
- data/lib/HDLRuby/hdrcc.rb +140 -24
- data/lib/HDLRuby/hruby_decorator.rb +250 -0
- data/lib/HDLRuby/hruby_high.rb +468 -91
- data/lib/HDLRuby/hruby_low.rb +913 -45
- data/lib/HDLRuby/hruby_low2c.rb +189 -168
- data/lib/HDLRuby/hruby_low2hdr.rb +738 -0
- data/lib/HDLRuby/hruby_low2high.rb +331 -549
- data/lib/HDLRuby/hruby_low2vhd.rb +39 -2
- data/lib/HDLRuby/hruby_low_bool2select.rb +29 -0
- data/lib/HDLRuby/hruby_low_casts_without_expression.rb +27 -0
- data/lib/HDLRuby/hruby_low_fix_types.rb +25 -0
- data/lib/HDLRuby/hruby_low_mutable.rb +70 -0
- data/lib/HDLRuby/hruby_low_resolve.rb +28 -0
- data/lib/HDLRuby/hruby_low_without_connection.rb +6 -3
- data/lib/HDLRuby/hruby_low_without_namespace.rb +7 -4
- data/lib/HDLRuby/hruby_low_without_parinseq.rb +151 -0
- data/lib/HDLRuby/hruby_low_without_select.rb +13 -0
- data/lib/HDLRuby/hruby_tools.rb +11 -1
- data/lib/HDLRuby/hruby_verilog.rb +1602 -1629
- data/lib/HDLRuby/sim/hruby_sim.h +25 -2
- data/lib/HDLRuby/sim/hruby_sim_calc.c +63 -6
- data/lib/HDLRuby/sim/hruby_sim_vcd.c +5 -1
- data/lib/HDLRuby/sim/hruby_sim_vizualize.c +22 -6
- data/lib/HDLRuby/std/fixpoint.rb +9 -0
- data/lib/HDLRuby/std/function_generator.rb +139 -0
- data/lib/HDLRuby/std/hruby_unit.rb +75 -0
- data/lib/HDLRuby/template_expander.rb +61 -0
- data/lib/HDLRuby/version.rb +1 -1
- metadata +22 -5
data/lib/HDLRuby/hruby_low2c.rb
CHANGED
@@ -32,6 +32,13 @@ module HDLRuby::Low
|
|
32
32
|
return [1.to_i].pack("i").size*8
|
33
33
|
end
|
34
34
|
|
35
|
+
## Converts string +str+ to a C-compatible string.
|
36
|
+
def self.c_string(str)
|
37
|
+
str = str.gsub(/\n/,"\\n")
|
38
|
+
str.gsub!(/\t/,"\\t")
|
39
|
+
return str
|
40
|
+
end
|
41
|
+
|
35
42
|
## Tells if a +name+ is C-compatible.
|
36
43
|
# To ensure compatibile, assume all the character must have the
|
37
44
|
# same case.
|
@@ -139,10 +146,10 @@ module HDLRuby::Low
|
|
139
146
|
end
|
140
147
|
|
141
148
|
|
142
|
-
## Extends the SystemT class with generation of
|
149
|
+
## Extends the SystemT class with generation of C text.
|
143
150
|
class SystemT
|
144
151
|
|
145
|
-
# Generates the text of the equivalent HDLRuby
|
152
|
+
# Generates the text of the equivalent HDLRuby code.
|
146
153
|
# +level+ is the hierachical level of the object and +hnames+
|
147
154
|
# is the list of extra h files to include.
|
148
155
|
def to_c(level = 0, *hnames)
|
@@ -178,6 +185,7 @@ module HDLRuby::Low
|
|
178
185
|
end
|
179
186
|
end
|
180
187
|
self.scope.each_block_deep do |block|
|
188
|
+
# puts "treating for block=#{Low2C.obj_name(block)} with=#{block.each_inner.count} inners"
|
181
189
|
block.each_inner do |signal|
|
182
190
|
# res << signal.value.to_c_make(level) if signal.value
|
183
191
|
signal.value.each_node_deep do |node|
|
@@ -344,10 +352,10 @@ module HDLRuby::Low
|
|
344
352
|
end
|
345
353
|
|
346
354
|
|
347
|
-
## Extends the Scope class with generation of
|
355
|
+
## Extends the Scope class with generation of C text.
|
348
356
|
class Scope
|
349
357
|
|
350
|
-
# Generates the text of the equivalent HDLRuby
|
358
|
+
# Generates the C text of the equivalent HDLRuby code.
|
351
359
|
# +level+ is the hierachical level of the object.
|
352
360
|
def to_c(level = 0)
|
353
361
|
# The resulting string.
|
@@ -497,10 +505,10 @@ module HDLRuby::Low
|
|
497
505
|
end
|
498
506
|
|
499
507
|
|
500
|
-
## Extends the Type class with generation of
|
508
|
+
## Extends the Type class with generation of C text.
|
501
509
|
class Type
|
502
510
|
|
503
|
-
# Generates the C text of the equivalent HDLRuby
|
511
|
+
# Generates the C text of the equivalent HDLRuby code.
|
504
512
|
# +level+ is the hierachical level of the object.
|
505
513
|
def to_c(level = 0)
|
506
514
|
# return Low2C.c_name(self.name)
|
@@ -515,10 +523,10 @@ module HDLRuby::Low
|
|
515
523
|
end
|
516
524
|
end
|
517
525
|
|
518
|
-
## Extends the TypeDef class with generation of
|
526
|
+
## Extends the TypeDef class with generation of C text.
|
519
527
|
class TypeDef
|
520
528
|
|
521
|
-
# Generates the C text of the equivalent HDLRuby
|
529
|
+
# Generates the C text of the equivalent HDLRuby code.
|
522
530
|
# +level+ is the hierachical level of the object.
|
523
531
|
def to_c(level = 0)
|
524
532
|
# # Simply use the name of the type.
|
@@ -528,10 +536,10 @@ module HDLRuby::Low
|
|
528
536
|
end
|
529
537
|
end
|
530
538
|
|
531
|
-
## Extends the TypeVector class with generation of
|
539
|
+
## Extends the TypeVector class with generation of C text.
|
532
540
|
class TypeVector
|
533
541
|
|
534
|
-
# Generates the C text of the equivalent HDLRuby
|
542
|
+
# Generates the C text of the equivalent HDLRuby code.
|
535
543
|
# +level+ is the hierachical level of the object.
|
536
544
|
def to_c(level = 0)
|
537
545
|
# The resulting string.
|
@@ -540,10 +548,10 @@ module HDLRuby::Low
|
|
540
548
|
end
|
541
549
|
end
|
542
550
|
|
543
|
-
## Extends the TypeTuple class with generation of
|
551
|
+
## Extends the TypeTuple class with generation of C text.
|
544
552
|
class TypeTuple
|
545
553
|
|
546
|
-
# Generates the text of the equivalent HDLRuby
|
554
|
+
# Generates the C text of the equivalent HDLRuby code.
|
547
555
|
# +level+ is the hierachical level of the object.
|
548
556
|
#
|
549
557
|
# NOTE: type tuples are converted to bit vector of their contents.
|
@@ -556,10 +564,10 @@ module HDLRuby::Low
|
|
556
564
|
end
|
557
565
|
|
558
566
|
|
559
|
-
## Extends the TypeStruct class with generation of
|
567
|
+
## Extends the TypeStruct class with generation of C text.
|
560
568
|
class TypeStruct
|
561
569
|
|
562
|
-
# Generates the text of the equivalent HDLRuby
|
570
|
+
# Generates the text of the equivalent HDLRuby code.
|
563
571
|
# +level+ is the hierachical level of the object.
|
564
572
|
def to_c(level = 0)
|
565
573
|
return "get_type_struct(#{self.each.join(",") do |key,type|
|
@@ -569,10 +577,10 @@ module HDLRuby::Low
|
|
569
577
|
end
|
570
578
|
|
571
579
|
|
572
|
-
## Extends the Behavior class with generation of
|
580
|
+
## Extends the Behavior class with generation of C text.
|
573
581
|
class Behavior
|
574
582
|
|
575
|
-
# Generates the text of the equivalent HDLRuby
|
583
|
+
# Generates the text of the equivalent HDLRuby code.
|
576
584
|
# +level+ is the hierachical level of the object and
|
577
585
|
# +time+ is a flag telling if the behavior is timed or not.
|
578
586
|
def to_c(level = 0, time = false)
|
@@ -705,10 +713,10 @@ module HDLRuby::Low
|
|
705
713
|
end
|
706
714
|
end
|
707
715
|
|
708
|
-
## Extends the TimeBehavior class with generation of
|
716
|
+
## Extends the TimeBehavior class with generation of C text.
|
709
717
|
class TimeBehavior
|
710
718
|
|
711
|
-
# Generates the C text of the equivalent HDLRuby
|
719
|
+
# Generates the C text of the equivalent HDLRuby code.
|
712
720
|
# +level+ is the hierachical level of the object.
|
713
721
|
def to_c(level = 0)
|
714
722
|
super(level,true)
|
@@ -716,10 +724,10 @@ module HDLRuby::Low
|
|
716
724
|
end
|
717
725
|
|
718
726
|
|
719
|
-
## Extends the Event class with generation of
|
727
|
+
## Extends the Event class with generation of C text.
|
720
728
|
class Event
|
721
729
|
|
722
|
-
# Generates the C text of the equivalent HDLRuby
|
730
|
+
# Generates the C text of the equivalent HDLRuby code.
|
723
731
|
# +level+ is the hierachical level of the object.
|
724
732
|
def to_c(level = 0)
|
725
733
|
edge = "ANYEDGE"
|
@@ -731,7 +739,7 @@ module HDLRuby::Low
|
|
731
739
|
end
|
732
740
|
|
733
741
|
|
734
|
-
## Extends the SignalI class with generation of
|
742
|
+
## Extends the SignalI class with generation of C text.
|
735
743
|
class SignalI
|
736
744
|
|
737
745
|
## Generates the C text for an access to the signal.
|
@@ -747,7 +755,7 @@ module HDLRuby::Low
|
|
747
755
|
return res
|
748
756
|
end
|
749
757
|
|
750
|
-
## Generates the C text of the equivalent HDLRuby
|
758
|
+
## Generates the C text of the equivalent HDLRuby code.
|
751
759
|
# +level+ is the hierachical level of the object.
|
752
760
|
def to_c(level = 0)
|
753
761
|
# The resulting string.
|
@@ -837,6 +845,7 @@ module HDLRuby::Low
|
|
837
845
|
## Generates the content of the h file.
|
838
846
|
def to_ch
|
839
847
|
res = ""
|
848
|
+
# puts "to_ch for SignalI: #{self.to_c_signal()}"
|
840
849
|
# Declare the global variable holding the signal.
|
841
850
|
res << "extern SignalI #{self.to_c_signal()};\n\n"
|
842
851
|
|
@@ -848,10 +857,10 @@ module HDLRuby::Low
|
|
848
857
|
end
|
849
858
|
|
850
859
|
|
851
|
-
## Extends the SystemI class with generation of
|
860
|
+
## Extends the SystemI class with generation of C text.
|
852
861
|
class SystemI
|
853
862
|
|
854
|
-
## Generates the C text of the equivalent HDLRuby
|
863
|
+
## Generates the C text of the equivalent HDLRuby code.
|
855
864
|
# +level+ is the hierachical level of the object.
|
856
865
|
def to_c(level = 0)
|
857
866
|
# The resulting string.
|
@@ -917,7 +926,7 @@ module HDLRuby::Low
|
|
917
926
|
# Extend the Chunk cass with generation of text code.
|
918
927
|
class HDLRuby::Low::Chunk
|
919
928
|
|
920
|
-
# Generates the text of the equivalent HDLRuby
|
929
|
+
# Generates the C text of the equivalent HDLRuby code.
|
921
930
|
# +level+ is the hierachical level of the object.
|
922
931
|
def to_c(level = 0)
|
923
932
|
res = " " * level
|
@@ -933,9 +942,9 @@ module HDLRuby::Low
|
|
933
942
|
end
|
934
943
|
|
935
944
|
|
936
|
-
## Extends the SystemI class with generation of
|
945
|
+
## Extends the SystemI class with generation of C text.
|
937
946
|
class Code
|
938
|
-
# Generates the text of the equivalent HDLRuby
|
947
|
+
# Generates the C text of the equivalent HDLRuby code.
|
939
948
|
# +level+ is the hierachical level of the object.
|
940
949
|
def to_c(level = 0)
|
941
950
|
# puts "For behavior: #{self}"
|
@@ -1040,16 +1049,22 @@ module HDLRuby::Low
|
|
1040
1049
|
end
|
1041
1050
|
|
1042
1051
|
|
1043
|
-
## Extends the Statement class with generation of
|
1052
|
+
## Extends the Statement class with generation of C text.
|
1044
1053
|
class Statement
|
1045
1054
|
|
1046
|
-
# Generates the C text of the equivalent HDLRuby
|
1055
|
+
# Generates the C text of the equivalent HDLRuby code.
|
1047
1056
|
# +level+ is the hierachical level of the object.
|
1048
1057
|
def to_c(level = 0)
|
1049
1058
|
# Should never be here.
|
1050
1059
|
raise AnyError, "Internal error: to_c should be implemented in class :#{self.class}"
|
1051
1060
|
end
|
1052
1061
|
|
1062
|
+
## Generates the content of the h file.
|
1063
|
+
def to_ch
|
1064
|
+
# By default nothing to generate.
|
1065
|
+
return ""
|
1066
|
+
end
|
1067
|
+
|
1053
1068
|
# Adds the c code of the blocks to +res+ at +level+
|
1054
1069
|
def add_blocks_code(res,level)
|
1055
1070
|
if self.respond_to?(:each_node) then
|
@@ -1060,12 +1075,23 @@ module HDLRuby::Low
|
|
1060
1075
|
end
|
1061
1076
|
end
|
1062
1077
|
end
|
1078
|
+
|
1079
|
+
# Adds the creation of the blocks to +res+ at +level+.
|
1080
|
+
def add_make_block(res,level)
|
1081
|
+
if self.respond_to?(:each_node) then
|
1082
|
+
self.each_node do |node|
|
1083
|
+
if node.respond_to?(:add_blocks_code) then
|
1084
|
+
node.add_make_block(res,level)
|
1085
|
+
end
|
1086
|
+
end
|
1087
|
+
end
|
1088
|
+
end
|
1063
1089
|
end
|
1064
1090
|
|
1065
|
-
## Extends the Transmit class with generation of
|
1091
|
+
## Extends the Transmit class with generation of C text.
|
1066
1092
|
class Transmit
|
1067
1093
|
|
1068
|
-
# Generates the C text of the equivalent HDLRuby
|
1094
|
+
# Generates the C text of the equivalent HDLRuby code.
|
1069
1095
|
# +level+ is the hierachical level of the object.
|
1070
1096
|
def to_c(level = 0)
|
1071
1097
|
# Save the state of the value pool.
|
@@ -1097,11 +1123,48 @@ module HDLRuby::Low
|
|
1097
1123
|
end
|
1098
1124
|
end
|
1099
1125
|
|
1126
|
+
|
1127
|
+
## Extends the Print class with generation of C text.
|
1128
|
+
class Print
|
1129
|
+
|
1130
|
+
# Generates the C text of the equivalent HDLRuby code.
|
1131
|
+
# +level+ is the hierachical level of the object.
|
1132
|
+
def to_c(level = 0)
|
1133
|
+
# Save the state of the value pool.
|
1134
|
+
res = (" " * ((level)*3))
|
1135
|
+
res << "{\n"
|
1136
|
+
res << (" " * ((level+1)*3))
|
1137
|
+
res << "unsigned int pool_state = get_value_pos();\n"
|
1138
|
+
# Perform the copy and the touching only if the new content
|
1139
|
+
# is different.
|
1140
|
+
res << (" " * ((level+1)*3))
|
1141
|
+
# Is it a sequential execution model?
|
1142
|
+
seq = self.block.mode == :seq ? "_seq" : ""
|
1143
|
+
# Generate the print.
|
1144
|
+
self.each_arg do |arg|
|
1145
|
+
if (arg.is_a?(StringE)) then
|
1146
|
+
res << "printer.print_string(\"" +
|
1147
|
+
Low2C.c_string(arg.content) + "\");\n"
|
1148
|
+
elsif (arg.is_a?(Expression)) then
|
1149
|
+
res << "printer.print_string_value(" + arg.to_c + ");\n"
|
1150
|
+
else
|
1151
|
+
res << "printer.print_string_name(" + arg.to_c + ");\n"
|
1152
|
+
end
|
1153
|
+
end
|
1154
|
+
# Restore the value pool state.
|
1155
|
+
res << (" " * ((level+1)*3))
|
1156
|
+
res << "set_value_pos(pool_state);\n"
|
1157
|
+
res << (" " * ((level)*3))
|
1158
|
+
res << "}\n"
|
1159
|
+
return res
|
1160
|
+
end
|
1161
|
+
end
|
1162
|
+
|
1100
1163
|
|
1101
|
-
## Extends the If class with generation of
|
1164
|
+
## Extends the If class with generation of C text.
|
1102
1165
|
class If
|
1103
1166
|
|
1104
|
-
# Generates the C text of the equivalent HDLRuby
|
1167
|
+
# Generates the C text of the equivalent HDLRuby code.
|
1105
1168
|
# +level+ is the hierachical level of the object.
|
1106
1169
|
def to_c(level = 0)
|
1107
1170
|
# The result string.
|
@@ -1143,12 +1206,24 @@ module HDLRuby::Low
|
|
1143
1206
|
# Return the result.
|
1144
1207
|
return res
|
1145
1208
|
end
|
1209
|
+
|
1210
|
+
## Generates the content of the h file.
|
1211
|
+
def to_ch
|
1212
|
+
res = ""
|
1213
|
+
# Recurse on the sub statements.
|
1214
|
+
res << self.yes.to_ch
|
1215
|
+
self.each_noif do |cond,stmnt|
|
1216
|
+
res << stmnt.to_ch
|
1217
|
+
end
|
1218
|
+
res << self.no.to_ch if self.no
|
1219
|
+
return res
|
1220
|
+
end
|
1146
1221
|
end
|
1147
1222
|
|
1148
|
-
## Extends the When class with generation of
|
1223
|
+
## Extends the When class with generation of C text.
|
1149
1224
|
class When
|
1150
1225
|
|
1151
|
-
# Generates the C text of the equivalent HDLRuby
|
1226
|
+
# Generates the C text of the equivalent HDLRuby code.
|
1152
1227
|
# +level+ is the hierachical level of the object.
|
1153
1228
|
def to_c(level = 0)
|
1154
1229
|
# The result string.
|
@@ -1164,16 +1239,26 @@ module HDLRuby::Low
|
|
1164
1239
|
return res
|
1165
1240
|
end
|
1166
1241
|
|
1242
|
+
## Generates the content of the h file.
|
1243
|
+
def to_ch
|
1244
|
+
return self.statement.to_ch
|
1245
|
+
end
|
1246
|
+
|
1167
1247
|
# Adds the c code of the blocks to +res+ at +level+
|
1168
1248
|
def add_blocks_code(res,level)
|
1169
1249
|
self.statement.add_blocks_code(res,level)
|
1170
1250
|
end
|
1251
|
+
|
1252
|
+
# Adds the creation of the blocks to +res+ at +level+.
|
1253
|
+
def add_make_block(res,level)
|
1254
|
+
self.statement.add_make_block(res,level)
|
1255
|
+
end
|
1171
1256
|
end
|
1172
1257
|
|
1173
|
-
## Extends the Case class with generation of
|
1258
|
+
## Extends the Case class with generation of C text.
|
1174
1259
|
class Case
|
1175
1260
|
|
1176
|
-
# Generates the text of the equivalent HDLRuby
|
1261
|
+
# Generates the text of the equivalent HDLRuby code.
|
1177
1262
|
# +level+ is the hierachical level of the object.
|
1178
1263
|
def to_c(level = 0)
|
1179
1264
|
res = ""
|
@@ -1215,13 +1300,23 @@ module HDLRuby::Low
|
|
1215
1300
|
# Return the resulting string.
|
1216
1301
|
return res
|
1217
1302
|
end
|
1303
|
+
|
1304
|
+
## Generates the content of the h file.
|
1305
|
+
def to_ch
|
1306
|
+
res = ""
|
1307
|
+
# Recurse on the whens.
|
1308
|
+
self.each_when {|w| res << w.to_ch }
|
1309
|
+
# Recurse on the default statement.
|
1310
|
+
res << self.default.to_ch if self.default
|
1311
|
+
return res
|
1312
|
+
end
|
1218
1313
|
end
|
1219
1314
|
|
1220
1315
|
|
1221
|
-
## Extends the Delay class with generation of
|
1316
|
+
## Extends the Delay class with generation of C text.
|
1222
1317
|
class Delay
|
1223
1318
|
|
1224
|
-
# Generates the C text of the equivalent HDLRuby
|
1319
|
+
# Generates the C text of the equivalent HDLRuby code.
|
1225
1320
|
# +level+ is the hierachical level of the object.
|
1226
1321
|
def to_c(level = 0)
|
1227
1322
|
return "make_delay(#{self.value.to_s}," +
|
@@ -1230,10 +1325,10 @@ module HDLRuby::Low
|
|
1230
1325
|
end
|
1231
1326
|
|
1232
1327
|
|
1233
|
-
## Extends the TimeWait class with generation of
|
1328
|
+
## Extends the TimeWait class with generation of C text.
|
1234
1329
|
class TimeWait
|
1235
1330
|
|
1236
|
-
# Generates the C text of the equivalent HDLRuby
|
1331
|
+
# Generates the C text of the equivalent HDLRuby code.
|
1237
1332
|
# +level+ is the hierachical level of the object.
|
1238
1333
|
def to_c(level = 0)
|
1239
1334
|
# The resulting string.
|
@@ -1246,10 +1341,10 @@ module HDLRuby::Low
|
|
1246
1341
|
end
|
1247
1342
|
end
|
1248
1343
|
|
1249
|
-
## Extends the TimeRepeat class with generation of
|
1344
|
+
## Extends the TimeRepeat class with generation of C text.
|
1250
1345
|
class TimeRepeat
|
1251
1346
|
|
1252
|
-
# Generates the C text of the equivalent HDLRuby
|
1347
|
+
# Generates the C text of the equivalent HDLRuby code.
|
1253
1348
|
# +level+ is the hierachical level of the object.
|
1254
1349
|
def to_c(level = 0)
|
1255
1350
|
# The resulting string.
|
@@ -1264,7 +1359,7 @@ module HDLRuby::Low
|
|
1264
1359
|
end
|
1265
1360
|
end
|
1266
1361
|
|
1267
|
-
## Extends the Block class with generation of
|
1362
|
+
## Extends the Block class with generation of C text.
|
1268
1363
|
class Block
|
1269
1364
|
|
1270
1365
|
# Adds the c code of the blocks to +res+ at +level+
|
@@ -1272,7 +1367,13 @@ module HDLRuby::Low
|
|
1272
1367
|
res << self.to_c_code(level)
|
1273
1368
|
end
|
1274
1369
|
|
1275
|
-
#
|
1370
|
+
# Adds the creation of the blocks to +res+ at +level+.
|
1371
|
+
def add_make_block(res,level)
|
1372
|
+
res << " " * level*3
|
1373
|
+
res << "#{Low2C.make_name(self)}();\n"
|
1374
|
+
end
|
1375
|
+
|
1376
|
+
# Generates the C text of the equivalent HDLRuby code.
|
1276
1377
|
# +level+ is the hierachical level of the object.
|
1277
1378
|
def to_c_code(level = 0)
|
1278
1379
|
# The resulting string.
|
@@ -1351,6 +1452,11 @@ module HDLRuby::Low
|
|
1351
1452
|
res << " " * (level+1)*3
|
1352
1453
|
res << "block->function = &#{Low2C.code_name(self)};\n"
|
1353
1454
|
|
1455
|
+
# Generate creation of the sub blocks.
|
1456
|
+
self.each_statement do |stmnt|
|
1457
|
+
stmnt.add_make_block(res,level+1)
|
1458
|
+
end
|
1459
|
+
|
1354
1460
|
# Generate the Returns of the result.
|
1355
1461
|
res << "\n"
|
1356
1462
|
res << " " * (level+1)*3
|
@@ -1363,7 +1469,7 @@ module HDLRuby::Low
|
|
1363
1469
|
end
|
1364
1470
|
|
1365
1471
|
# Generates the execution of the block C text of the equivalent
|
1366
|
-
# HDLRuby
|
1472
|
+
# HDLRuby code.
|
1367
1473
|
# +level+ is the hierachical level of the object.
|
1368
1474
|
def to_c(level = 0)
|
1369
1475
|
res = " " * (level)
|
@@ -1373,6 +1479,7 @@ module HDLRuby::Low
|
|
1373
1479
|
|
1374
1480
|
## Generates the content of the h file.
|
1375
1481
|
def to_ch
|
1482
|
+
# puts "to_ch for block=#{Low2C.obj_name(self)} with=#{self.each_inner.count} inners"
|
1376
1483
|
res = ""
|
1377
1484
|
# Declare the global variable holding the block.
|
1378
1485
|
res << "extern Block #{Low2C.obj_name(self)};\n\n"
|
@@ -1383,27 +1490,31 @@ module HDLRuby::Low
|
|
1383
1490
|
# Generate the accesses to the ports.
|
1384
1491
|
self.each_inner { |inner| res << inner.to_ch }
|
1385
1492
|
|
1493
|
+
# Recurse on the statements.
|
1494
|
+
self.each_statement { |stmnt| res << stmnt.to_ch }
|
1495
|
+
|
1496
|
+
|
1386
1497
|
return res
|
1387
1498
|
end
|
1388
1499
|
end
|
1389
1500
|
|
1390
1501
|
|
1391
|
-
## Extends the Block class with generation of
|
1502
|
+
## Extends the Block class with generation of C text.
|
1392
1503
|
class TimeBlock
|
1393
1504
|
# TimeBlock is identical to Block in C
|
1394
1505
|
end
|
1395
1506
|
|
1396
1507
|
|
1397
|
-
## Extends the Connection class with generation of
|
1508
|
+
## Extends the Connection class with generation of C text.
|
1398
1509
|
class Connection
|
1399
1510
|
# Nothing required, Transmit is generated identically.
|
1400
1511
|
end
|
1401
1512
|
|
1402
1513
|
|
1403
|
-
## Extends the Expression class with generation of
|
1514
|
+
## Extends the Expression class with generation of C text.
|
1404
1515
|
class Expression
|
1405
1516
|
|
1406
|
-
# Generates the C text of the equivalent HDLRuby
|
1517
|
+
# Generates the C text of the equivalent HDLRuby code.
|
1407
1518
|
# +level+ is the hierachical level of the object.
|
1408
1519
|
def to_c(level = 0)
|
1409
1520
|
# Should never be here.
|
@@ -1412,7 +1523,7 @@ module HDLRuby::Low
|
|
1412
1523
|
end
|
1413
1524
|
|
1414
1525
|
|
1415
|
-
## Extends the Value class with generation of
|
1526
|
+
## Extends the Value class with generation of C text.
|
1416
1527
|
class Value
|
1417
1528
|
|
1418
1529
|
## Generates the C text for an access to the value.
|
@@ -1491,10 +1602,10 @@ module HDLRuby::Low
|
|
1491
1602
|
end
|
1492
1603
|
end
|
1493
1604
|
|
1494
|
-
## Extends the Cast class with generation of
|
1605
|
+
## Extends the Cast class with generation of C text.
|
1495
1606
|
class Cast
|
1496
1607
|
|
1497
|
-
# Generates the C text of the equivalent HDLRuby
|
1608
|
+
# Generates the C text of the equivalent HDLRuby code.
|
1498
1609
|
# +level+ is the hierachical level of the object.
|
1499
1610
|
def to_c(level = 0)
|
1500
1611
|
res = "({\n"
|
@@ -1522,10 +1633,10 @@ module HDLRuby::Low
|
|
1522
1633
|
end
|
1523
1634
|
|
1524
1635
|
|
1525
|
-
## Extends the Operation class with generation of
|
1636
|
+
## Extends the Operation class with generation of C text.
|
1526
1637
|
class Operation
|
1527
1638
|
|
1528
|
-
# Generates the C text of the equivalent HDLRuby
|
1639
|
+
# Generates the C text of the equivalent HDLRuby code.
|
1529
1640
|
# +level+ is the hierachical level of the object.
|
1530
1641
|
def to_c(level = 0)
|
1531
1642
|
# Should never be here.
|
@@ -1533,10 +1644,10 @@ module HDLRuby::Low
|
|
1533
1644
|
end
|
1534
1645
|
end
|
1535
1646
|
|
1536
|
-
## Extends the Unary class with generation of
|
1647
|
+
## Extends the Unary class with generation of C text.
|
1537
1648
|
class Unary
|
1538
1649
|
|
1539
|
-
# Generates the C text of the equivalent HDLRuby
|
1650
|
+
# Generates the C text of the equivalent HDLRuby code.
|
1540
1651
|
# +level+ is the hierachical level of the object.
|
1541
1652
|
def to_c(level = 0)
|
1542
1653
|
res = "({\n"
|
@@ -1578,80 +1689,10 @@ module HDLRuby::Low
|
|
1578
1689
|
end
|
1579
1690
|
|
1580
1691
|
|
1581
|
-
## Extends the Binary class with generation of
|
1692
|
+
## Extends the Binary class with generation of C text.
|
1582
1693
|
class Binary
|
1583
1694
|
|
1584
|
-
#
|
1585
|
-
# # +level+ is the hierachical level of the object.
|
1586
|
-
# def to_c(level = 0)
|
1587
|
-
# res = ""
|
1588
|
-
# case self.operator
|
1589
|
-
# when :+ then
|
1590
|
-
# return "add_value(#{self.left.to_c(level)}," +
|
1591
|
-
# "#{self.right.to_c(level)})"
|
1592
|
-
# when :- then
|
1593
|
-
# return "sub_value(#{self.left.to_c(level)}," +
|
1594
|
-
# "#{self.right.to_c(level)})"
|
1595
|
-
# when :* then
|
1596
|
-
# return "mul_value(#{self.left.to_c(level)}," +
|
1597
|
-
# "#{self.right.to_c(level)})"
|
1598
|
-
# when :/ then
|
1599
|
-
# return "div_value(#{self.left.to_c(level)}," +
|
1600
|
-
# "#{self.right.to_c(level)})"
|
1601
|
-
# when :% then
|
1602
|
-
# return "mod_value(#{self.left.to_c(level)}," +
|
1603
|
-
# "#{self.right.to_c(level)})"
|
1604
|
-
# when :** then
|
1605
|
-
# return "pow_value(#{self.left.to_c(level)}," +
|
1606
|
-
# "#{self.right.to_c(level)})"
|
1607
|
-
# when :& then
|
1608
|
-
# return "and_value(#{self.left.to_c(level)}," +
|
1609
|
-
# "#{self.right.to_c(level)})"
|
1610
|
-
# when :| then
|
1611
|
-
# return "or_value(#{self.left.to_c(level)}," +
|
1612
|
-
# "#{self.right.to_c(level)})"
|
1613
|
-
# when :^ then
|
1614
|
-
# return "xor_value(#{self.left.to_c(level)}," +
|
1615
|
-
# "#{self.right.to_c(level)})"
|
1616
|
-
# when :<<,:ls then
|
1617
|
-
# return "shift_left_value(#{self.left.to_c(level)}," +
|
1618
|
-
# "#{self.right.to_c(level)})"
|
1619
|
-
# when :>>,:rs then
|
1620
|
-
# return "shift_right_value(#{self.left.to_c(level)}," +
|
1621
|
-
# "#{self.right.to_c(level)})"
|
1622
|
-
# when :lr then
|
1623
|
-
# return "rotate_left_value(#{self.left.to_c(level)}," +
|
1624
|
-
# "#{self.right.to_c(level)})"
|
1625
|
-
# when :rr then
|
1626
|
-
# return "rotate_right_value(#{self.left.to_c(level)}," +
|
1627
|
-
# "#{self.right.to_c(level)})"
|
1628
|
-
# when :== then
|
1629
|
-
# return "equal_value(#{self.left.to_c(level)}," +
|
1630
|
-
# "#{self.right.to_c(level)})"
|
1631
|
-
# when :!= then
|
1632
|
-
# # return "not_equal_value(#{self.left.to_c(level)}," +
|
1633
|
-
# # "#{self.right.to_c(level)})"
|
1634
|
-
# return "xor_value(#{self.left.to_c(level)}," +
|
1635
|
-
# "#{self.right.to_c(level)})"
|
1636
|
-
# when :> then
|
1637
|
-
# return "greater_value(#{self.left.to_c(level)}," +
|
1638
|
-
# "#{self.right.to_c(level)})"
|
1639
|
-
# when :< then
|
1640
|
-
# return "lesser_value(#{self.left.to_c(level)}," +
|
1641
|
-
# "#{self.right.to_c(level)})"
|
1642
|
-
# when :>= then
|
1643
|
-
# return "greater_equal_value(#{self.left.to_c(level)}," +
|
1644
|
-
# "#{self.right.to_c(level)})"
|
1645
|
-
# when :<= then
|
1646
|
-
# return "lesser_equal_value(#{self.left.to_c(level)}," +
|
1647
|
-
# "#{self.right.to_c(level)})"
|
1648
|
-
# else
|
1649
|
-
# raise "Invalid binary operator: #{self.operator}."
|
1650
|
-
# end
|
1651
|
-
# return res
|
1652
|
-
# end
|
1653
|
-
|
1654
|
-
# Generates the C text of the equivalent HDLRuby::High code.
|
1695
|
+
# Generates the C text of the equivalent HDLRuby code.
|
1655
1696
|
# +level+ is the hierachical level of the object.
|
1656
1697
|
def to_c(level = 0)
|
1657
1698
|
# res = " " * (level*3)
|
@@ -1728,17 +1769,12 @@ module HDLRuby::Low
|
|
1728
1769
|
end
|
1729
1770
|
end
|
1730
1771
|
|
1731
|
-
## Extends the Select class with generation of
|
1772
|
+
## Extends the Select class with generation of C text.
|
1732
1773
|
class Select
|
1733
1774
|
|
1734
|
-
# Generates the C text of the equivalent HDLRuby
|
1775
|
+
# Generates the C text of the equivalent HDLRuby code.
|
1735
1776
|
# +level+ is the hierachical level of the object.
|
1736
1777
|
def to_c(level = 0)
|
1737
|
-
# res = "select_value(#{self.select.to_c(level)}," +
|
1738
|
-
# "#{self.each_choice.to_a.size}"
|
1739
|
-
# self.each_choice { |choice| res << ",#{choice.to_c(level)}" }
|
1740
|
-
# res << ")"
|
1741
|
-
# return res
|
1742
1778
|
# Gather the possible selection choices.
|
1743
1779
|
expressions = self.each_choice.to_a
|
1744
1780
|
# Create the resulting string.
|
@@ -1779,10 +1815,10 @@ module HDLRuby::Low
|
|
1779
1815
|
end
|
1780
1816
|
end
|
1781
1817
|
|
1782
|
-
## Extends the Concat class with generation of
|
1818
|
+
## Extends the Concat class with generation of C text.
|
1783
1819
|
class Concat
|
1784
1820
|
|
1785
|
-
# Generates the C text of the equivalent HDLRuby
|
1821
|
+
# Generates the C text of the equivalent HDLRuby code.
|
1786
1822
|
# +level+ is the hierachical level of the object.
|
1787
1823
|
def to_c(level = 0)
|
1788
1824
|
# Gather the content to concat.
|
@@ -1826,10 +1862,10 @@ module HDLRuby::Low
|
|
1826
1862
|
end
|
1827
1863
|
|
1828
1864
|
|
1829
|
-
## Extends the Ref class with generation of
|
1865
|
+
## Extends the Ref class with generation of C text.
|
1830
1866
|
class Ref
|
1831
1867
|
|
1832
|
-
# Generates the C text of the equivalent HDLRuby
|
1868
|
+
# Generates the C text of the equivalent HDLRuby code.
|
1833
1869
|
# +level+ is the hierachical level of the object and
|
1834
1870
|
# +left+ tells if it is a left value or not.
|
1835
1871
|
def to_c(level = 0, left = false)
|
@@ -1838,10 +1874,11 @@ module HDLRuby::Low
|
|
1838
1874
|
end
|
1839
1875
|
end
|
1840
1876
|
|
1841
|
-
|
1877
|
+
|
1878
|
+
## Extends the RefConcat class with generation of C text.
|
1842
1879
|
class RefConcat
|
1843
1880
|
|
1844
|
-
# Generates the C text of the equivalent HDLRuby
|
1881
|
+
# Generates the C text of the equivalent HDLRuby code.
|
1845
1882
|
# +level+ is the hierachical level of the object and
|
1846
1883
|
# +left+ tells if it is a left value or not.
|
1847
1884
|
def to_c(level = 0, left = false)
|
@@ -1870,10 +1907,10 @@ module HDLRuby::Low
|
|
1870
1907
|
end
|
1871
1908
|
|
1872
1909
|
|
1873
|
-
## Extends the RefIndex class with generation of
|
1910
|
+
## Extends the RefIndex class with generation of C text.
|
1874
1911
|
class RefIndex
|
1875
1912
|
|
1876
|
-
# Generates the C text of the equivalent HDLRuby
|
1913
|
+
# Generates the C text of the equivalent HDLRuby code.
|
1877
1914
|
# +level+ is thehierachical level of the object and
|
1878
1915
|
# +left+ tells if it is a left value or not.
|
1879
1916
|
def to_c(level = 0, left = false)
|
@@ -1914,22 +1951,13 @@ module HDLRuby::Low
|
|
1914
1951
|
end
|
1915
1952
|
|
1916
1953
|
|
1917
|
-
## Extends the RefRange class with generation of
|
1954
|
+
## Extends the RefRange class with generation of C text.
|
1918
1955
|
class RefRange
|
1919
1956
|
|
1920
|
-
# Generates the C text of the equivalent HDLRuby
|
1957
|
+
# Generates the C text of the equivalent HDLRuby code.
|
1921
1958
|
# +level+ is the hierachical level of the object and
|
1922
1959
|
# +left+ tells if it is a left value or not.
|
1923
1960
|
def to_c(level = 0, left = false)
|
1924
|
-
# if left then
|
1925
|
-
# res = "write_range(#{self.ref.to_c(level,left)},"
|
1926
|
-
# else
|
1927
|
-
# res = "read_range(#{self.ref.to_c(level,left)},"
|
1928
|
-
# end
|
1929
|
-
# res << "read64(#{self.range.first.to_c(level)})," +
|
1930
|
-
# "read64(#{self.range.last.to_c(level)})," +
|
1931
|
-
# "#{self.type.base.to_c(level)})"
|
1932
|
-
# return res
|
1933
1961
|
# Decide if it is a read or a write
|
1934
1962
|
command = left ? "write" : "read"
|
1935
1963
|
res = "({\n"
|
@@ -1974,10 +2002,11 @@ module HDLRuby::Low
|
|
1974
2002
|
end
|
1975
2003
|
end
|
1976
2004
|
|
1977
|
-
|
2005
|
+
|
2006
|
+
## Extends the RefName class with generation of C text.
|
1978
2007
|
class RefName
|
1979
2008
|
|
1980
|
-
# Generates the C text of the equivalent HDLRuby
|
2009
|
+
# Generates the C text of the equivalent HDLRuby code.
|
1981
2010
|
# +level+ is the hierachical level of the object and
|
1982
2011
|
# +left+ tells if it is a left value or not.
|
1983
2012
|
def to_c(level = 0, left = false)
|
@@ -1994,9 +2023,10 @@ module HDLRuby::Low
|
|
1994
2023
|
end
|
1995
2024
|
end
|
1996
2025
|
|
1997
|
-
|
2026
|
+
|
2027
|
+
## Extends the RefThis class with generation of C text.
|
1998
2028
|
class RefThis
|
1999
|
-
# Generates the C text of the equivalent HDLRuby
|
2029
|
+
# Generates the C text of the equivalent HDLRuby code.
|
2000
2030
|
# +level+ is the hierachical level of the object and
|
2001
2031
|
# +left+ tells if it is a left value or not.
|
2002
2032
|
def to_c(level = 0, left = false)
|
@@ -2010,14 +2040,5 @@ module HDLRuby::Low
|
|
2010
2040
|
end
|
2011
2041
|
end
|
2012
2042
|
|
2013
|
-
# ## Extends the Numeric class with generation of HDLRuby::High text.
|
2014
|
-
# class ::Numeric
|
2015
|
-
|
2016
|
-
# # Generates the text of the equivalent HDLRuby::High code.
|
2017
|
-
# # +level+ is the hierachical level of the object.
|
2018
|
-
# def to_c(level = 0)
|
2019
|
-
# return self.to_s
|
2020
|
-
# end
|
2021
|
-
# end
|
2022
2043
|
|
2023
2044
|
end
|