HDLRuby 2.7.1 → 2.8.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/HDLRuby/hdr_samples/adder_gen.rb +22 -0
- data/lib/HDLRuby/hdr_samples/adder_gen_gen.rb +40 -0
- data/lib/HDLRuby/hdr_samples/case_bench.rb +23 -18
- data/lib/HDLRuby/hdr_samples/dff_unit.rb +1 -1
- data/lib/HDLRuby/hdr_samples/parseq_bench.rb +61 -0
- data/lib/HDLRuby/hdr_samples/range_bench.rb +4 -1
- data/lib/HDLRuby/hdr_samples/rom_nest.rb +27 -0
- data/lib/HDLRuby/hdr_samples/with_channel_other.rb +128 -0
- data/lib/HDLRuby/hdr_samples/with_def.rb +29 -0
- data/lib/HDLRuby/hdr_samples/with_init.rb +18 -0
- data/lib/HDLRuby/hdr_samples/with_instance.rb +42 -0
- data/lib/HDLRuby/hdr_samples/with_reconf.rb +75 -67
- data/lib/HDLRuby/hdr_samples/with_terminate.rb +32 -0
- data/lib/HDLRuby/hdr_samples/with_values.rb +3 -0
- data/lib/HDLRuby/hdrcc.rb +8 -1
- data/lib/HDLRuby/hruby_high.rb +178 -29
- data/lib/HDLRuby/hruby_low.rb +210 -4
- data/lib/HDLRuby/hruby_low2c.rb +186 -71
- data/lib/HDLRuby/hruby_low2vhd.rb +12 -0
- data/lib/HDLRuby/hruby_low_bool2select.rb +12 -0
- data/lib/HDLRuby/hruby_low_fix_types.rb +20 -1
- data/lib/HDLRuby/hruby_low_resolve.rb +30 -1
- data/lib/HDLRuby/hruby_low_without_select.rb +11 -1
- data/lib/HDLRuby/hruby_tools.rb +1 -0
- data/lib/HDLRuby/hruby_verilog.rb +9 -1
- data/lib/HDLRuby/sim/hruby_sim.h +26 -1
- data/lib/HDLRuby/sim/hruby_sim_core.c +65 -8
- data/lib/HDLRuby/sim/hruby_sim_stack_calc.c +11 -0
- data/lib/HDLRuby/sim/hruby_sim_vcd.c +1 -1
- data/lib/HDLRuby/std/reconf.rb +3 -0
- data/lib/HDLRuby/version.rb +1 -1
- metadata +10 -2
data/lib/HDLRuby/hruby_low2c.rb
CHANGED
@@ -135,6 +135,8 @@ module HDLRuby::Low
|
|
135
135
|
objs.each { |obj| res << " " << Low2C.make_name(obj) << "();\n" }
|
136
136
|
# Sets the top systemT.
|
137
137
|
res << " top_system = " << Low2C.obj_name(top) << ";\n"
|
138
|
+
# Enable it.
|
139
|
+
res << " set_enable_system(top_system,1);\n"
|
138
140
|
# Starts the simulation.
|
139
141
|
res<< " hruby_sim_core(\"#{name}\",#{init_visualizer},-1);\n"
|
140
142
|
# Close the main.
|
@@ -170,6 +172,7 @@ module HDLRuby::Low
|
|
170
172
|
# is the list of extra h files to include.
|
171
173
|
# def to_c(level = 0, *hnames)
|
172
174
|
def to_c(res, level = 0, *hnames)
|
175
|
+
# puts "SystemT.to_c with name=#{Low2C.obj_name(self)}#{@wrapper ? " and wrapper=#{Low2C.obj_name(@wrapper)}" : ""}"
|
173
176
|
# The header
|
174
177
|
# res = Low2C.includes(*hnames)
|
175
178
|
res << Low2C.includes(*hnames)
|
@@ -179,7 +182,16 @@ module HDLRuby::Low
|
|
179
182
|
|
180
183
|
# Generate the signals of the system.
|
181
184
|
# self.each_signal { |signal| signal.to_c(level) }
|
182
|
-
|
185
|
+
if ((defined? @wrapper) && @wrapper) then
|
186
|
+
# It is a reconfiguring system, alias the signals.
|
187
|
+
wrap_signals = @wrapper.each_signal.to_a
|
188
|
+
self.each_signal.with_index do |signal,i|
|
189
|
+
signal.to_c_alias(res,wrap_signals[i],level)
|
190
|
+
end
|
191
|
+
else
|
192
|
+
# It is a single system, default generation.
|
193
|
+
self.each_signal { |signal| signal.to_c(res,level) }
|
194
|
+
end
|
183
195
|
|
184
196
|
# Generate the code for all the blocks included in the system.
|
185
197
|
self.scope.each_scope_deep do |scope|
|
@@ -356,8 +368,13 @@ module HDLRuby::Low
|
|
356
368
|
end
|
357
369
|
self.scope.each_block_deep do |block|
|
358
370
|
block.each_inner do |signal|
|
359
|
-
#
|
360
|
-
|
371
|
+
# signal.value.to_ch(res) if signal.value
|
372
|
+
if signal.value then
|
373
|
+
signal.value.each_node_deep do |node|
|
374
|
+
# res << node.to_ch if node.is_a?(Value)
|
375
|
+
node.to_ch(res) if node.is_a?(Value)
|
376
|
+
end
|
377
|
+
end
|
361
378
|
end
|
362
379
|
block.each_node_deep do |node|
|
363
380
|
# res << node.to_ch if node.is_a?(Value)
|
@@ -681,6 +698,10 @@ module HDLRuby::Low
|
|
681
698
|
res << "behavior->owner = NULL;\n"
|
682
699
|
end
|
683
700
|
|
701
|
+
# Set the behavior as not enabled. */
|
702
|
+
res << " " * (level+1)*3
|
703
|
+
res << "behavior->enabled = 0;\n"
|
704
|
+
|
684
705
|
# Set the behavior as inactive. */
|
685
706
|
res << " " * (level+1)*3
|
686
707
|
res << "behavior->activated = 0;\n"
|
@@ -702,6 +723,10 @@ module HDLRuby::Low
|
|
702
723
|
end.to_a
|
703
724
|
# Keep only one ref per signal.
|
704
725
|
refs.uniq! { |node| node.full_name }
|
726
|
+
# Remove the inner signals from the list.
|
727
|
+
self.block.each_inner do |inner|
|
728
|
+
refs.delete_if {|r| r.name == inner.name }
|
729
|
+
end
|
705
730
|
# Generate the event.
|
706
731
|
events = refs.map {|ref| Event.new(:anyedge,ref.clone) }
|
707
732
|
# Add them to the behavior for further processing.
|
@@ -833,11 +858,8 @@ module HDLRuby::Low
|
|
833
858
|
# +level+ is the hierachical level of the object.
|
834
859
|
# def to_c(level = 0)
|
835
860
|
def to_c(res,level = 0)
|
836
|
-
#
|
837
|
-
# res = ""
|
838
|
-
|
861
|
+
# puts "Signal.to_c with name: #{Low2C.obj_name(self)}"
|
839
862
|
# Declare the global variable holding the signal.
|
840
|
-
# res << "SignalI #{self.to_c_signal(level+1)};\n\n"
|
841
863
|
res << "SignalI "
|
842
864
|
self.to_c_signal(res,level+1)
|
843
865
|
res << ";\n\n"
|
@@ -845,6 +867,7 @@ module HDLRuby::Low
|
|
845
867
|
# The header of the signal generation.
|
846
868
|
res << " " * level*3
|
847
869
|
res << "SignalI " << Low2C.make_name(self) << "() {\n"
|
870
|
+
|
848
871
|
# res << " " * level*3
|
849
872
|
# res << "Value l,r,d;\n"
|
850
873
|
# res << " " * (level+1)*3
|
@@ -857,7 +880,6 @@ module HDLRuby::Low
|
|
857
880
|
# Sets the global variable of the signal.
|
858
881
|
res << "\n"
|
859
882
|
res << " " * (level+1)*3
|
860
|
-
# res << "#{self.to_c_signal(level+1)} = signalI;\n"
|
861
883
|
self.to_c_signal(res,level+1)
|
862
884
|
res << " = signalI;\n"
|
863
885
|
|
@@ -891,11 +913,12 @@ module HDLRuby::Low
|
|
891
913
|
if self.value then
|
892
914
|
# There is an initial value.
|
893
915
|
res << " " * (level+1)*3
|
894
|
-
# res << "copy_value(
|
895
|
-
#
|
916
|
+
# res << "copy_value("
|
917
|
+
# self.value.to_c_expr(res,level+2)
|
918
|
+
# res << ",signalI->c_value);\n"
|
896
919
|
res << "copy_value("
|
897
920
|
self.value.to_c_expr(res,level+2)
|
898
|
-
res << ",signalI->
|
921
|
+
res << ",signalI->f_value);\n"
|
899
922
|
end
|
900
923
|
|
901
924
|
# Initially the signal can be overwritten by anything.
|
@@ -948,6 +971,43 @@ module HDLRuby::Low
|
|
948
971
|
|
949
972
|
return res;
|
950
973
|
end
|
974
|
+
|
975
|
+
## Generates the C text of the equivalent HDLRuby code in case
|
976
|
+
# the signals is actually an alias to another signal.
|
977
|
+
# +other+ is the target signal of the alias.
|
978
|
+
# +level+ is the hierachical level of the object.
|
979
|
+
def to_c_alias(res,target,level = 0)
|
980
|
+
# puts "Signal.to_c_alias with name: #{Low2C.obj_name(self)}"
|
981
|
+
# The resulting string.
|
982
|
+
# res = ""
|
983
|
+
|
984
|
+
# Declare the global variable holding the signal.
|
985
|
+
res << "SignalI "
|
986
|
+
self.to_c_signal(res,level+1)
|
987
|
+
res << ";\n\n"
|
988
|
+
|
989
|
+
# The header of the signal generation.
|
990
|
+
res << " " * level*3
|
991
|
+
res << "SignalI " << Low2C.make_name(self) << "() {\n"
|
992
|
+
|
993
|
+
res << "SignalI signalI = #{Low2C.obj_name(target)};\n"
|
994
|
+
|
995
|
+
# Sets the global variable of the signal.
|
996
|
+
res << "\n"
|
997
|
+
res << " " * (level+1)*3
|
998
|
+
self.to_c_signal(res,level+1)
|
999
|
+
res << " = signalI;\n"
|
1000
|
+
|
1001
|
+
# Generate the return of the signal.
|
1002
|
+
res << "\n"
|
1003
|
+
res << " " * (level+1)*3
|
1004
|
+
res << "return signalI;\n"
|
1005
|
+
|
1006
|
+
# Close the signal.
|
1007
|
+
res << " " * level*3
|
1008
|
+
res << "};\n\n"
|
1009
|
+
return res
|
1010
|
+
end
|
951
1011
|
end
|
952
1012
|
|
953
1013
|
|
@@ -989,9 +1049,22 @@ module HDLRuby::Low
|
|
989
1049
|
# Set the name
|
990
1050
|
res << " " * (level+1)*3
|
991
1051
|
res << "systemI->name = \"#{self.name}\";\n"
|
992
|
-
# Set the type.
|
1052
|
+
# # Set the type.
|
1053
|
+
# res << " " * (level+1)*3
|
1054
|
+
# res << "systemI->system = " << Low2C.obj_name(self.systemT) << ";\n"
|
1055
|
+
# Set the systems.
|
1056
|
+
num_sys = self.each_systemT.to_a.size
|
1057
|
+
res << " " * (level+1)*3
|
1058
|
+
res << "systemI->num_systems = #{num_sys};\n"
|
993
1059
|
res << " " * (level+1)*3
|
994
|
-
res << "systemI->
|
1060
|
+
res << "systemI->systems = calloc(sizeof(SystemT), #{num_sys});\n"
|
1061
|
+
self.each_systemT.with_index do |sysT,i|
|
1062
|
+
res << " " * (level+1)*3
|
1063
|
+
res << "systemI->systems[#{i}] = #{Low2C.obj_name(sysT)};\n"
|
1064
|
+
end
|
1065
|
+
|
1066
|
+
# Configure the instance to current systemT.
|
1067
|
+
res << (" " * (level*3)) << "configure(systemI,0);\n"
|
995
1068
|
|
996
1069
|
# Generate the return of the signal.
|
997
1070
|
res << "\n"
|
@@ -1090,6 +1163,10 @@ module HDLRuby::Low
|
|
1090
1163
|
res << "code->owner = NULL;\n"
|
1091
1164
|
end
|
1092
1165
|
|
1166
|
+
# Set the code as enabled (for now, may change in a near future). */
|
1167
|
+
res << " " * (level+1)*3
|
1168
|
+
res << "code->enabled = 1;\n"
|
1169
|
+
|
1093
1170
|
# Set the code as inactive. */
|
1094
1171
|
res << " " * (level+1)*3
|
1095
1172
|
res << "code->activated = 0;\n"
|
@@ -1382,6 +1459,28 @@ module HDLRuby::Low
|
|
1382
1459
|
end
|
1383
1460
|
end
|
1384
1461
|
|
1462
|
+
## Extends the TimeTerminate class with generation of C text.
|
1463
|
+
class TimeTerminate
|
1464
|
+
|
1465
|
+
# Generates the C text of the equivalent HDLRuby code.
|
1466
|
+
# +level+ is the hierachical level of the object.
|
1467
|
+
def to_c(res,level = 0)
|
1468
|
+
# Save the value pool state.
|
1469
|
+
res << (" " * (level*3)) << "terminate();\n"
|
1470
|
+
end
|
1471
|
+
end
|
1472
|
+
|
1473
|
+
## Extends the Configure class with generation of C text.
|
1474
|
+
class Configure
|
1475
|
+
|
1476
|
+
# Generates the C text of the equivalent HDLRuby code.
|
1477
|
+
# +level+ is the hierachical level of the object.
|
1478
|
+
def to_c(res,level = 0)
|
1479
|
+
# Save the value pool state.
|
1480
|
+
res << (" " * (level*3)) << "configure(#{Low2C.obj_name(self.ref.resolve)},#{self.index});\n"
|
1481
|
+
end
|
1482
|
+
end
|
1483
|
+
|
1385
1484
|
|
1386
1485
|
## Extends the If class with generation of C text.
|
1387
1486
|
class If
|
@@ -1610,26 +1709,18 @@ module HDLRuby::Low
|
|
1610
1709
|
res << "{\n"
|
1611
1710
|
self.value.to_c(res,level+1)
|
1612
1711
|
res << " " * ((level+1)*3)
|
1613
|
-
res << "
|
1712
|
+
res << "dup();\n"
|
1614
1713
|
# Ensure the selection value is testable.
|
1615
1714
|
res << " " * ((level+1)*3)
|
1616
|
-
res << "if (
|
1715
|
+
res << "if (is_defined()) {\n"
|
1617
1716
|
# The condition is testable.
|
1618
1717
|
# Generate the case as a succession of if statements.
|
1619
|
-
first = true
|
1620
1718
|
self.each_when do |w|
|
1621
1719
|
res << " " * ((level+2)*3)
|
1622
|
-
|
1623
|
-
first = false
|
1624
|
-
else
|
1625
|
-
res << "else "
|
1626
|
-
end
|
1627
|
-
res << "if (value2integer(v) == "
|
1628
|
-
res << "value2integer(({\n"
|
1720
|
+
res << "dup();\n"
|
1629
1721
|
res << " " * ((level+2)*3)
|
1630
1722
|
w.match.to_c(res,level+2)
|
1631
|
-
res << "
|
1632
|
-
res << ")) {\n"
|
1723
|
+
res << "if (to_integer() == to_integer()) {\n"
|
1633
1724
|
w.statement.to_c(res,level+3)
|
1634
1725
|
res << " " * (level+2)*3
|
1635
1726
|
res << "}\n"
|
@@ -1643,6 +1734,8 @@ module HDLRuby::Low
|
|
1643
1734
|
end
|
1644
1735
|
# Close the case.
|
1645
1736
|
res << " " * (level+1)*3
|
1737
|
+
res << "pop();\n" # Remove the testing value.
|
1738
|
+
res << " " * (level+1)*3
|
1646
1739
|
res << "}\n"
|
1647
1740
|
res << " " * (level)*3
|
1648
1741
|
res << "}\n"
|
@@ -1899,6 +1992,16 @@ module HDLRuby::Low
|
|
1899
1992
|
# Should never be here.
|
1900
1993
|
raise AnyError, "Internal error: to_c should be implemented in class :#{self.class}"
|
1901
1994
|
end
|
1995
|
+
|
1996
|
+
## Generates the C text for an expression access to the expression,
|
1997
|
+
# default case.
|
1998
|
+
# +level+ is the hierachical level of the object.
|
1999
|
+
def to_c_expr(res,level = 0)
|
2000
|
+
res << "({"
|
2001
|
+
self.to_c(res,level+1)
|
2002
|
+
res << (" " * ((level+1)*3))
|
2003
|
+
res << "pop();})"
|
2004
|
+
end
|
1902
2005
|
end
|
1903
2006
|
|
1904
2007
|
|
@@ -2461,46 +2564,64 @@ module HDLRuby::Low
|
|
2461
2564
|
return res
|
2462
2565
|
end
|
2463
2566
|
|
2464
|
-
# Generates the C text of expression for the equivalent HDLRuby code.
|
2465
|
-
# +level+ is the hierachical level of the object.
|
2466
|
-
def to_c_expr(res,level = 0)
|
2467
|
-
|
2468
|
-
|
2469
|
-
|
2470
|
-
|
2471
|
-
|
2472
|
-
|
2473
|
-
|
2474
|
-
|
2475
|
-
|
2476
|
-
|
2477
|
-
|
2478
|
-
|
2479
|
-
|
2480
|
-
|
2481
|
-
|
2482
|
-
|
2483
|
-
|
2484
|
-
|
2485
|
-
|
2486
|
-
|
2487
|
-
|
2488
|
-
|
2489
|
-
|
2490
|
-
|
2491
|
-
|
2492
|
-
|
2493
|
-
|
2494
|
-
|
2495
|
-
|
2496
|
-
|
2497
|
-
|
2498
|
-
|
2499
|
-
|
2500
|
-
|
2501
|
-
|
2502
|
-
|
2503
|
-
end
|
2567
|
+
# # # Generates the C text of expression for the equivalent HDLRuby code.
|
2568
|
+
# # # +level+ is the hierachical level of the object.
|
2569
|
+
# # def to_c_expr(res,level = 0)
|
2570
|
+
# # # Gather the content to concat.
|
2571
|
+
# # expressions = self.each_expression.to_a
|
2572
|
+
# # # Create the resulting string.
|
2573
|
+
# # res << "({\n"
|
2574
|
+
# # # Overrides the upper src0, src1, ..., and dst...
|
2575
|
+
# # # And allocates a new value for dst.
|
2576
|
+
# # res << (" " * ((level+1)*3))
|
2577
|
+
# # res << "Value "
|
2578
|
+
# # res << expressions.size.times.map do |i|
|
2579
|
+
# # "src#{i}"
|
2580
|
+
# # end.join(",")
|
2581
|
+
# # res << ";\n"
|
2582
|
+
# # res << (" " * ((level+1)*3))
|
2583
|
+
# # res << "Value dst = get_value();\n"
|
2584
|
+
# # # Save the value pool state.
|
2585
|
+
# # res << (" " * (level*3)) << "SV;\n"
|
2586
|
+
# # # Compute each sub expression.
|
2587
|
+
# # expressions.each_with_index do |expr,i|
|
2588
|
+
# # res << (" " * ((level+1)*3))
|
2589
|
+
# # res << "src#{i} = "
|
2590
|
+
# # expr.to_c_expr(res,level+2)
|
2591
|
+
# # res << ";\n"
|
2592
|
+
# # end
|
2593
|
+
# # # Compute the direction.
|
2594
|
+
# # # Compute the resulting concatenation.
|
2595
|
+
# # res << (" " * ((level+1)*3))
|
2596
|
+
# # res << "concat_value(#{expressions.size},"
|
2597
|
+
# # res << "#{self.type.direction == :little ? 1 : 0},dst,"
|
2598
|
+
# # res << expressions.size.times.map { |i| "src#{i}" }.join(",")
|
2599
|
+
# # res << ");\n"
|
2600
|
+
# # # Save the value pool state.
|
2601
|
+
# # res << (" " * (level*3)) << "SV;\n"
|
2602
|
+
# # # Close the computation.
|
2603
|
+
# # res << (" " * (level*3))
|
2604
|
+
# # res << "dst; })"
|
2605
|
+
# # return res
|
2606
|
+
# # end
|
2607
|
+
# def to_c_expr(res,level = 0)
|
2608
|
+
# # Save the value pool state.
|
2609
|
+
# res << "({ PV;"
|
2610
|
+
# # Gather the content to concat.
|
2611
|
+
# expressions = self.each_expression.to_a
|
2612
|
+
# # Compute each sub expression.
|
2613
|
+
# expressions.each_with_index do |expr,i|
|
2614
|
+
# expr.to_c(res,level+2)
|
2615
|
+
# end
|
2616
|
+
# # Compute the resulting concatenation.
|
2617
|
+
# res << (" " * ((level+1)*3))
|
2618
|
+
# res << "sconcat(#{expressions.size},"
|
2619
|
+
# res << (self.type.direction == :little ? "1" : "0")
|
2620
|
+
# res << ");\n"
|
2621
|
+
# # Restore the value pool state.
|
2622
|
+
# res << "RV; pop();})"
|
2623
|
+
# return res
|
2624
|
+
# end
|
2504
2625
|
end
|
2505
2626
|
|
2506
2627
|
|
@@ -2784,17 +2905,11 @@ module HDLRuby::Low
|
|
2784
2905
|
# +left+ tells if it is a left value or not.
|
2785
2906
|
# def to_c(level = 0, left = false)
|
2786
2907
|
def to_c(res,level = 0, left = false)
|
2787
|
-
# # puts "RefName to_c for #{self.name}"
|
2788
|
-
# self.resolve.to_c_signal(res,level+1)
|
2789
|
-
# res << "->" << (left ? "f_value" : "c_value")
|
2790
|
-
# return res
|
2791
2908
|
# puts "RefName to_c for #{self.name}"
|
2792
2909
|
res << (" " * (level*3))
|
2793
|
-
# res << "d="
|
2794
2910
|
res << "push("
|
2795
2911
|
self.resolve.to_c_signal(res,level+1)
|
2796
2912
|
res << "->" << (left ? "f_value" : "c_value")
|
2797
|
-
# res << ";\n"
|
2798
2913
|
res << ");\n"
|
2799
2914
|
return res
|
2800
2915
|
end
|
@@ -925,6 +925,18 @@ module HDLRuby::Low
|
|
925
925
|
end.join(" & ") + ";\n"
|
926
926
|
end
|
927
927
|
end
|
928
|
+
|
929
|
+
## Extends the TimeTerminate class with generation of HDLRuby::High text.
|
930
|
+
class TimeTerminate
|
931
|
+
|
932
|
+
# Generates the text of the equivalent HDLRuby::High code.
|
933
|
+
# +vars+ is the list of the variables and
|
934
|
+
# +level+ is the hierachical level of the object.
|
935
|
+
def to_vhdl(vars,level = 0)
|
936
|
+
# Generate a report statement.
|
937
|
+
return " " * (level*3) + "finish;\n"
|
938
|
+
end
|
939
|
+
end
|
928
940
|
|
929
941
|
## Extends the If class with generation of HDLRuby::High text.
|
930
942
|
class If
|
@@ -75,6 +75,18 @@ module HDLRuby::Low
|
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
78
|
+
|
79
|
+
## Extends the TimeTerminate class with functionality for converting booleans
|
80
|
+
# in assignments to select operators.
|
81
|
+
class TimeTerminate
|
82
|
+
|
83
|
+
# Converts booleans in assignments to select operators.
|
84
|
+
def boolean_in_assign2select!
|
85
|
+
# Nothing to do.
|
86
|
+
return self
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
78
90
|
|
79
91
|
## Extends the If class with functionality for converting booleans
|
80
92
|
# in assignments to select operators.
|
@@ -71,7 +71,7 @@ module HDLRuby::Low
|
|
71
71
|
class Statement
|
72
72
|
# Explicit the types conversions in the statement.
|
73
73
|
def explicit_types!
|
74
|
-
raise "Should implement explicit_types for class #{self.class}."
|
74
|
+
raise "Should implement explicit_types! for class #{self.class}."
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
@@ -98,7 +98,26 @@ module HDLRuby::Low
|
|
98
98
|
self.map_args!(&:explicit_types)
|
99
99
|
return self
|
100
100
|
end
|
101
|
+
end
|
102
|
+
|
103
|
+
|
104
|
+
## Extends the Configure class with fixing of types and constants.
|
105
|
+
class Configure
|
106
|
+
# Explicit the types conversions in the statement.
|
107
|
+
def explicit_types!
|
108
|
+
# Nothing to do.
|
109
|
+
return self
|
110
|
+
end
|
111
|
+
end
|
101
112
|
|
113
|
+
|
114
|
+
## Extends the TimeTerminate class with fixing of types and constants.
|
115
|
+
class TimeTerminate
|
116
|
+
# Explicit the types conversions in the statement.
|
117
|
+
def explicit_types!
|
118
|
+
# Nothing to do.
|
119
|
+
return self
|
120
|
+
end
|
102
121
|
end
|
103
122
|
|
104
123
|
|
@@ -50,9 +50,25 @@ module HDLRuby::Low
|
|
50
50
|
return found if found
|
51
51
|
# Maybe it is a sub scope.
|
52
52
|
return self.each_scope.find { |scope| scope.name == name }
|
53
|
+
# Maybe it in the behavior.
|
54
|
+
return self.behavior.get_by_name
|
53
55
|
end
|
54
56
|
end
|
55
57
|
|
58
|
+
##
|
59
|
+
# Extends Behavior with the capability of finding one of its inner object
|
60
|
+
# by name.
|
61
|
+
class Behavior
|
62
|
+
|
63
|
+
## Find an inner object by +name+.
|
64
|
+
# NOTE: return nil if not found.
|
65
|
+
def get_by_name(name)
|
66
|
+
if (self.block.name == name.to_sym) then
|
67
|
+
return self.block
|
68
|
+
end
|
69
|
+
return self.block.get_by_name(name)
|
70
|
+
end
|
71
|
+
end
|
56
72
|
|
57
73
|
##
|
58
74
|
# Extends SystemI with the capability of finding one of its inner object
|
@@ -79,7 +95,16 @@ module HDLRuby::Low
|
|
79
95
|
# Ensure the name is a symbol.
|
80
96
|
name = name.to_sym
|
81
97
|
# Look in the signals.
|
82
|
-
|
98
|
+
found = self.get_inner(name)
|
99
|
+
return found if found
|
100
|
+
# Check the sub blocks names.
|
101
|
+
self.each_block do |block|
|
102
|
+
# puts "block=#{block.name}"
|
103
|
+
if (block.name == name) then
|
104
|
+
return block
|
105
|
+
end
|
106
|
+
end
|
107
|
+
return nil
|
83
108
|
end
|
84
109
|
end
|
85
110
|
|
@@ -199,6 +224,7 @@ module HDLRuby::Low
|
|
199
224
|
if self.ref.is_a?(RefName) then
|
200
225
|
# puts "ref name=#{self.ref.name}"
|
201
226
|
obj = self.ref.resolve
|
227
|
+
# puts "obj=#{obj}"
|
202
228
|
# Look into the object for the name.
|
203
229
|
return obj.get_by_name(self.name)
|
204
230
|
else
|
@@ -208,12 +234,15 @@ module HDLRuby::Low
|
|
208
234
|
while parent
|
209
235
|
# puts "parent=#{parent}"
|
210
236
|
if parent.respond_to?(:get_by_name) then
|
237
|
+
# puts "get_by_name"
|
211
238
|
found = parent.get_by_name(self.name)
|
239
|
+
# puts "found" if found
|
212
240
|
return found if found
|
213
241
|
end
|
214
242
|
parent = parent.parent
|
215
243
|
end
|
216
244
|
# Not found.
|
245
|
+
puts "Not found!"
|
217
246
|
return nil
|
218
247
|
end
|
219
248
|
end
|
@@ -163,7 +163,7 @@ module HDLRuby::Low
|
|
163
163
|
end
|
164
164
|
end
|
165
165
|
|
166
|
-
## Extends the
|
166
|
+
## Extends the Print class with functionality for converting select
|
167
167
|
# expressions to case statements.
|
168
168
|
class Print
|
169
169
|
# Extract the Select expressions.
|
@@ -175,6 +175,16 @@ module HDLRuby::Low
|
|
175
175
|
return selects
|
176
176
|
end
|
177
177
|
end
|
178
|
+
|
179
|
+
## Extends the TimeTerminate class with functionality for converting select
|
180
|
+
# expressions to case statements.
|
181
|
+
class TimeTerminate
|
182
|
+
# Extract the Select expressions.
|
183
|
+
def extract_selects!
|
184
|
+
# Nothing to extract.
|
185
|
+
return []
|
186
|
+
end
|
187
|
+
end
|
178
188
|
|
179
189
|
## Extends the If class with functionality for converting select
|
180
190
|
# expressions to case statements.
|
data/lib/HDLRuby/hruby_tools.rb
CHANGED
@@ -171,7 +171,7 @@ module HDLRuby::Low
|
|
171
171
|
|
172
172
|
# Enhance Print with generation of verilog code.
|
173
173
|
class Print
|
174
|
-
# Converts the
|
174
|
+
# Converts the print to Verilog code.
|
175
175
|
def to_verilog(spc = 3)
|
176
176
|
code = "#{" " * spc}$write(#{self.each_arg.map do |arg|
|
177
177
|
arg.to_verilog
|
@@ -180,6 +180,14 @@ module HDLRuby::Low
|
|
180
180
|
end
|
181
181
|
end
|
182
182
|
|
183
|
+
# Enhance TimeTerminate with generation of verilog code.
|
184
|
+
class TimeTerminate
|
185
|
+
# Converts the terminate to Verilog code.
|
186
|
+
def to_verilog(spc = 3)
|
187
|
+
return "#{" " * spc}$finish;"
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
183
191
|
# To scheduling to the Block.
|
184
192
|
# Enhance Block with generation of verilog code.
|
185
193
|
class Block
|
data/lib/HDLRuby/sim/hruby_sim.h
CHANGED
@@ -467,7 +467,10 @@ typedef struct SystemIS_ {
|
|
467
467
|
Object owner; /* The owner if any. */
|
468
468
|
|
469
469
|
char* name; /* The name of the signal. */
|
470
|
-
SystemT system; /* The instantiated system. */
|
470
|
+
SystemT system; /* The currently instantiated system. */
|
471
|
+
|
472
|
+
int num_systems; /* The number of systems possibly instantiated here. */
|
473
|
+
SystemT* systems; /* The systems possibly instantiated here. */
|
471
474
|
} SystemIS;
|
472
475
|
|
473
476
|
|
@@ -499,6 +502,8 @@ typedef struct BehaviorS_ {
|
|
499
502
|
Event* events; /* The events of the behavior. */
|
500
503
|
Block block; /* The block of the behavior. */
|
501
504
|
|
505
|
+
int enabled; /* Tells if the behavior is enabled or not. */
|
506
|
+
|
502
507
|
int activated; /* Tells if the behavior is activated or not. */
|
503
508
|
|
504
509
|
int timed; /* Tell if the behavior is timed or not:
|
@@ -519,6 +524,8 @@ typedef struct CodeS_ {
|
|
519
524
|
Event* events; /* The events of the behavior. */
|
520
525
|
void (*function)(); /* The function to execute for the code. */
|
521
526
|
|
527
|
+
int enabled; /* Tells if the behavior is enabled or not. */
|
528
|
+
|
522
529
|
int activated; /* Tells if the code is activated or not. */
|
523
530
|
} CodeS;
|
524
531
|
|
@@ -623,6 +630,16 @@ extern unsigned long long make_delay(int value, Unit unit);
|
|
623
630
|
* @param func function to applie on each signal. */
|
624
631
|
extern void each_all_signal(void (*func)(SignalI));
|
625
632
|
|
633
|
+
|
634
|
+
/** Configure a system instance.
|
635
|
+
* @param systemI the system instance to configure.
|
636
|
+
* @param idx the index of the target system. */
|
637
|
+
extern void configure(SystemI systemI, int idx);
|
638
|
+
|
639
|
+
|
640
|
+
/** Terminates the simulation. */
|
641
|
+
extern void terminate();
|
642
|
+
|
626
643
|
/* Interface to the visualization engine. */
|
627
644
|
|
628
645
|
typedef struct {
|
@@ -701,6 +718,11 @@ extern void init_vcd_visualizer(char* name);
|
|
701
718
|
|
702
719
|
/* The interface to the simulator core. */
|
703
720
|
|
721
|
+
/** Sets the enable status of the behaviors of a system type.
|
722
|
+
* @param systemT the system type to process.
|
723
|
+
* @param status the enable status. */
|
724
|
+
extern void set_enable_system(SystemT systemT, int status);
|
725
|
+
|
704
726
|
/** The simulation core function.
|
705
727
|
* @param name the name of the simulation.
|
706
728
|
* @param init_vizualizer the vizualizer engine initializer.
|
@@ -754,6 +776,9 @@ extern Value write_range_no_z(Value src, long long first, long long last,
|
|
754
776
|
* @param val the value to push. */
|
755
777
|
extern void push(Value val);
|
756
778
|
|
779
|
+
/** Duplicates a value in the stack. */
|
780
|
+
extern void dup();
|
781
|
+
|
757
782
|
/** Pops a value.
|
758
783
|
* @return the value. */
|
759
784
|
extern Value pop();
|