HDLRuby 2.10.3 → 2.11.0
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/HDLRuby.gemspec +1 -0
- data/README.md +8 -4
- data/Rakefile +8 -0
- data/{lib/HDLRuby/sim/Makefile → ext/hruby_sim/Makefile_csim} +0 -0
- data/ext/hruby_sim/extconf.rb +13 -0
- data/ext/hruby_sim/hruby_rcsim_build.c +1188 -0
- data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim.h +255 -16
- data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_calc.c +310 -181
- data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_core.c +34 -17
- data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_list.c +0 -0
- data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_stack_calc.c +4 -1
- data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_stack_calc.c.sav +0 -0
- data/ext/hruby_sim/hruby_sim_tree_calc.c +375 -0
- data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_vcd.c +5 -5
- data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_vizualize.c +2 -2
- data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_value_pool.c +4 -1
- data/lib/HDLRuby/hdr_samples/bstr_bench.rb +2 -0
- data/lib/HDLRuby/hdr_samples/case_bench.rb +2 -2
- data/lib/HDLRuby/hdr_samples/counter_bench.rb +0 -1
- data/lib/HDLRuby/hdr_samples/counter_dff_bench.rb +46 -0
- data/lib/HDLRuby/hdr_samples/dff_bench.rb +4 -1
- data/lib/HDLRuby/hdr_samples/dff_override.rb +76 -0
- data/lib/HDLRuby/hdr_samples/print_bench.rb +62 -0
- data/lib/HDLRuby/hdr_samples/rom.rb +5 -3
- data/lib/HDLRuby/hdr_samples/simple_counter_bench.rb +43 -0
- data/lib/HDLRuby/hdr_samples/with_values.rb +14 -0
- data/lib/HDLRuby/hdrcc.rb +84 -21
- data/lib/HDLRuby/hruby_bstr.rb +1175 -917
- data/lib/HDLRuby/hruby_high.rb +267 -97
- data/lib/HDLRuby/hruby_high_fullname.rb +82 -0
- data/lib/HDLRuby/hruby_low.rb +110 -71
- data/lib/HDLRuby/hruby_low2c.rb +7 -0
- data/lib/HDLRuby/hruby_low_mutable.rb +1 -1
- data/lib/HDLRuby/hruby_low_without_namespace.rb +2 -1
- data/lib/HDLRuby/hruby_rcsim.rb +978 -0
- data/lib/HDLRuby/hruby_rsim.rb +1134 -0
- data/lib/HDLRuby/hruby_rsim_vcd.rb +322 -0
- data/lib/HDLRuby/hruby_values.rb +362 -18
- data/lib/HDLRuby/hruby_verilog.rb +21 -3
- data/lib/HDLRuby/std/handshakes.rb +1 -1
- data/lib/HDLRuby/version.rb +1 -1
- metadata +25 -13
data/lib/HDLRuby/hruby_high.rb
CHANGED
@@ -38,7 +38,7 @@ module HDLRuby::High
|
|
38
38
|
# puts "eigen_extend for #{self} class=#{self.class}"
|
39
39
|
obj.singleton_methods.each do |name|
|
40
40
|
next if name == :yaml_tag # Do not know why we need to skip
|
41
|
-
|
41
|
+
puts "name=#{name}"
|
42
42
|
self.define_singleton_method(name, &obj.singleton_method(name))
|
43
43
|
end
|
44
44
|
end
|
@@ -87,10 +87,11 @@ module HDLRuby::High
|
|
87
87
|
raise AnyError,
|
88
88
|
"Resevered name #{name} cannot be overridden."
|
89
89
|
end
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
90
|
+
# Deactivated: overriding is now accepted.
|
91
|
+
# if self.respond_to?(name) then
|
92
|
+
# raise AnyError,
|
93
|
+
# "Symbol #{name} is already defined."
|
94
|
+
# end
|
94
95
|
define_singleton_method(name,&ruby_block)
|
95
96
|
end
|
96
97
|
end
|
@@ -669,7 +670,6 @@ module HDLRuby::High
|
|
669
670
|
# Fill the public namespace
|
670
671
|
space = self.public_namespace
|
671
672
|
# Interface signals
|
672
|
-
# puts "i_name=#{i_name} @to_includes=#{@to_includes.size}"
|
673
673
|
self.each_signal do |signal|
|
674
674
|
# puts "signal=#{signal.name}"
|
675
675
|
space.send(:define_singleton_method,signal.name) do
|
@@ -825,8 +825,20 @@ module HDLRuby::High
|
|
825
825
|
|
826
826
|
include Hmux
|
827
827
|
|
828
|
+
|
829
|
+
# Merge the included systems interface in current system.
|
830
|
+
# NOTE: incompatible with further to_low transformation.
|
831
|
+
def merge_included!
|
832
|
+
# puts "merge_included! for system=#{self.name}"
|
833
|
+
# Recurse on the system instances.
|
834
|
+
self.scope.merge_included!
|
835
|
+
# Merge for current system.
|
836
|
+
self.scope.merge_included(self)
|
837
|
+
end
|
838
|
+
|
839
|
+
|
828
840
|
# Fills the interface of a low level system.
|
829
|
-
def
|
841
|
+
def fill_interface_low(systemTlow)
|
830
842
|
# Adds its input signals.
|
831
843
|
self.each_input { |input| systemTlow.add_input(input.to_low) }
|
832
844
|
# Adds its output signals.
|
@@ -835,7 +847,7 @@ module HDLRuby::High
|
|
835
847
|
self.each_inout { |inout| systemTlow.add_inout(inout.to_low) }
|
836
848
|
# Adds the interface of its included systems.
|
837
849
|
self.scope.each_included do |included|
|
838
|
-
included.
|
850
|
+
included.fill_interface_low(systemTlow)
|
839
851
|
end
|
840
852
|
end
|
841
853
|
|
@@ -844,7 +856,7 @@ module HDLRuby::High
|
|
844
856
|
# NOTE: name conflicts are treated in the current NameStack state.
|
845
857
|
def fill_low(systemTlow)
|
846
858
|
# Fills the interface
|
847
|
-
self.
|
859
|
+
self.fill_interface_low(systemTlow)
|
848
860
|
end
|
849
861
|
|
850
862
|
# Converts the system to HDLRuby::Low and set its +name+.
|
@@ -1181,6 +1193,8 @@ module HDLRuby::High
|
|
1181
1193
|
|
1182
1194
|
# Declares a sub scope with possible +name+ and built from +ruby_block+.
|
1183
1195
|
def sub(name = :"", &ruby_block)
|
1196
|
+
# Ensure there is a block.
|
1197
|
+
ruby_block = proc {} unless block_given?
|
1184
1198
|
# Creates the new scope.
|
1185
1199
|
# scope = Scope.new(name,&ruby_block)
|
1186
1200
|
scope = Scope.new(name)
|
@@ -1197,6 +1211,8 @@ module HDLRuby::High
|
|
1197
1211
|
# Declares a high-level sequential behavior activated on a list of
|
1198
1212
|
# +events+, and built by executing +ruby_block+.
|
1199
1213
|
def seq(*events, &ruby_block)
|
1214
|
+
# Ensure there is a block.
|
1215
|
+
ruby_block = proc {} unless block_given?
|
1200
1216
|
# Preprocess the events.
|
1201
1217
|
events.map! do |event|
|
1202
1218
|
event.respond_to?(:to_event) ? event.to_event : event
|
@@ -1208,6 +1224,8 @@ module HDLRuby::High
|
|
1208
1224
|
# Declares a high-level parallel behavior activated on a list of
|
1209
1225
|
# +events+, and built by executing +ruby_block+.
|
1210
1226
|
def par(*events, &ruby_block)
|
1227
|
+
# Ensure there is a block.
|
1228
|
+
ruby_block = proc {} unless block_given?
|
1211
1229
|
# Preprocess the events.
|
1212
1230
|
events.map! do |event|
|
1213
1231
|
event.respond_to?(:to_event) ? event.to_event : event
|
@@ -1219,6 +1237,8 @@ module HDLRuby::High
|
|
1219
1237
|
# Declares a high-level timed behavior built by executing +ruby_block+.
|
1220
1238
|
# By default, timed behavior are sequential.
|
1221
1239
|
def timed(&ruby_block)
|
1240
|
+
# Ensure there is a block.
|
1241
|
+
ruby_block = proc {} unless block_given?
|
1222
1242
|
# Create and add the resulting behavior.
|
1223
1243
|
self.add_behavior(TimeBehavior.new(:seq,&ruby_block))
|
1224
1244
|
end
|
@@ -1232,6 +1252,8 @@ module HDLRuby::High
|
|
1232
1252
|
# * the else part is defined through the helse method.
|
1233
1253
|
# * a behavior is created to enclose the hif.
|
1234
1254
|
def hif(condition, mode = nil, &ruby_block)
|
1255
|
+
# Ensure there is a block.
|
1256
|
+
ruby_block = proc {} unless block_given?
|
1235
1257
|
self.par do
|
1236
1258
|
hif(condition,mode,&ruby_block)
|
1237
1259
|
end
|
@@ -1244,6 +1266,8 @@ module HDLRuby::High
|
|
1244
1266
|
#
|
1245
1267
|
# NOTE: added to the hif of the last behavior.
|
1246
1268
|
def helse(mode = nil, &ruby_block)
|
1269
|
+
# Ensure there is a block.
|
1270
|
+
ruby_block = proc {} unless block_given?
|
1247
1271
|
# There is a ruby_block: the helse is assumed to be with
|
1248
1272
|
# the last statement of the last behavior.
|
1249
1273
|
statement = self.last_behavior.last_statement
|
@@ -1258,6 +1282,8 @@ module HDLRuby::High
|
|
1258
1282
|
# with a +condition+ that when met lead
|
1259
1283
|
# to the execution of the block in +mode+ generated by the +ruby_block+.
|
1260
1284
|
def helsif(condition, mode = nil, &ruby_block)
|
1285
|
+
# Ensure there is a block.
|
1286
|
+
ruby_block = proc {} unless block_given?
|
1261
1287
|
# There is a ruby_block: the helse is assumed to be with
|
1262
1288
|
# the last statement of the last behavior.
|
1263
1289
|
statement = self.last_behavior.last_statement
|
@@ -1285,6 +1311,8 @@ module HDLRuby::High
|
|
1285
1311
|
#
|
1286
1312
|
# Can only be used once.
|
1287
1313
|
def hwhen(match, mode = nil, &ruby_block)
|
1314
|
+
# Ensure there is a block.
|
1315
|
+
ruby_block = proc {} unless block_given?
|
1288
1316
|
# There is a ruby_block: the helse is assumed to be with
|
1289
1317
|
# the last statement of the last behavior.
|
1290
1318
|
statement = @behaviors.last.last_statement
|
@@ -1364,6 +1392,72 @@ module HDLRuby::High
|
|
1364
1392
|
|
1365
1393
|
include Hmux
|
1366
1394
|
|
1395
|
+
|
1396
|
+
|
1397
|
+
# Merge the included systems interface in +systemT+
|
1398
|
+
# NOTE: incompatible with further to_low transformation.
|
1399
|
+
def merge_included(systemT)
|
1400
|
+
# Recurse on the sub.
|
1401
|
+
self.each_scope {|scope| scope.merge_included(systemT) }
|
1402
|
+
# Include for current scope.
|
1403
|
+
self.each_included do |included|
|
1404
|
+
included.merge_included!
|
1405
|
+
# Adds its interface signals.
|
1406
|
+
included.each_input do |input|
|
1407
|
+
input.no_parent!
|
1408
|
+
systemT.add_input(input)
|
1409
|
+
end
|
1410
|
+
included.each_output do |output|
|
1411
|
+
output.no_parent!
|
1412
|
+
systemT.add_output(output)
|
1413
|
+
end
|
1414
|
+
included.each_inout do |inout|
|
1415
|
+
inout.no_parent!
|
1416
|
+
systemT.add_inout(inout)
|
1417
|
+
end
|
1418
|
+
# Adds its behaviors.
|
1419
|
+
included.scope.each_behavior do |beh|
|
1420
|
+
beh.no_parent!
|
1421
|
+
systemT.scope.add_behavior(beh)
|
1422
|
+
end
|
1423
|
+
# Adds its connections.
|
1424
|
+
included.scope.each_connection do |cx|
|
1425
|
+
cx.no_parent!
|
1426
|
+
systemT.scope.add_connection(cx)
|
1427
|
+
end
|
1428
|
+
# Adds its sytem instances.
|
1429
|
+
included.scope.each_systemI do |sys|
|
1430
|
+
sys.no_parent!
|
1431
|
+
systemT.scope.add_systemI(sys)
|
1432
|
+
end
|
1433
|
+
# Adds its code.
|
1434
|
+
included.scope.each_code do |code|
|
1435
|
+
code.no_parent!
|
1436
|
+
systemT.scope.add_code(code)
|
1437
|
+
end
|
1438
|
+
# Adds its subscopes.
|
1439
|
+
included.scope.each_scope do |scope|
|
1440
|
+
scope.no_parent!
|
1441
|
+
systemT.scope.add_scope(scope)
|
1442
|
+
end
|
1443
|
+
# Add its inner signals.
|
1444
|
+
included.scope.each_inner do |inner|
|
1445
|
+
inner.no_parent!
|
1446
|
+
systemT.scope.add_inner(inner)
|
1447
|
+
end
|
1448
|
+
end
|
1449
|
+
end
|
1450
|
+
|
1451
|
+
# Merge the included systems interface in system instances.
|
1452
|
+
# NOTE: incompatible with further to_low transformation.
|
1453
|
+
def merge_included!
|
1454
|
+
# Recurse on the sub.
|
1455
|
+
self.each_scope {|scope| scope.merge_included! }
|
1456
|
+
# Merge in the system instances.
|
1457
|
+
self.each_systemI {|systemI| systemI.systemT.merge_included! }
|
1458
|
+
end
|
1459
|
+
|
1460
|
+
|
1367
1461
|
# Fills a low level scope with self's contents.
|
1368
1462
|
#
|
1369
1463
|
# NOTE: name conflicts are treated in the current NameStack state.
|
@@ -1607,6 +1701,8 @@ module HDLRuby::High
|
|
1607
1701
|
|
1608
1702
|
# Redefinition of +operator+.
|
1609
1703
|
def define_operator(operator,&ruby_block)
|
1704
|
+
# Ensure there is a block.
|
1705
|
+
ruby_block = proc {} unless block_given?
|
1610
1706
|
# Register the operator as overloaded.
|
1611
1707
|
@overloads ||= {}
|
1612
1708
|
@overloads[operator] = ruby_block
|
@@ -2003,6 +2099,8 @@ module HDLRuby::High
|
|
2003
2099
|
# Declares a high-level generic type named +name+, and using +ruby_block+
|
2004
2100
|
# for construction.
|
2005
2101
|
def typedef(name, &ruby_block)
|
2102
|
+
# Ensure there is a block.
|
2103
|
+
ruby_block = proc {} unless block_given?
|
2006
2104
|
type = TypeGen.new(name,&ruby_block)
|
2007
2105
|
if HDLRuby::High.in_system? then
|
2008
2106
|
# Must be inside a scope.
|
@@ -2038,6 +2136,8 @@ module HDLRuby::High
|
|
2038
2136
|
# Declares a high-level system type named +name+, with +includes+ mixins
|
2039
2137
|
# system types and using +ruby_block+ for instantiating.
|
2040
2138
|
def system(name = :"", *includes, &ruby_block)
|
2139
|
+
# Ensure there is a block.
|
2140
|
+
ruby_block = proc {} unless block_given?
|
2041
2141
|
# print "system ruby_block=#{ruby_block}\n"
|
2042
2142
|
# Creates the resulting system.
|
2043
2143
|
return SystemT.new(name,*includes,&ruby_block)
|
@@ -2049,6 +2149,8 @@ module HDLRuby::High
|
|
2049
2149
|
# NOTE: this is for generating directly an instance without declaring
|
2050
2150
|
# it system type.
|
2051
2151
|
def instance(name, *includes, &ruby_block)
|
2152
|
+
# Ensure there is a block.
|
2153
|
+
ruby_block = proc {} unless block_given?
|
2052
2154
|
# Creates the system type.
|
2053
2155
|
systemT = system(:"",*includes,&ruby_block)
|
2054
2156
|
# Instantiate it with +name+.
|
@@ -2061,6 +2163,8 @@ module HDLRuby::High
|
|
2061
2163
|
#
|
2062
2164
|
# NOTE: a function is a short-cut for a method that creates a scope.
|
2063
2165
|
def function(name, &ruby_block)
|
2166
|
+
# Ensure there is a block.
|
2167
|
+
ruby_block = proc {} unless block_given?
|
2064
2168
|
if HDLRuby::High.in_system? then
|
2065
2169
|
define_singleton_method(name.to_sym) do |*args,&other_block|
|
2066
2170
|
# sub do
|
@@ -2168,8 +2272,6 @@ module HDLRuby::High
|
|
2168
2272
|
else
|
2169
2273
|
# No, perform a connection is order of declaration
|
2170
2274
|
connects.each.with_index do |csig,i|
|
2171
|
-
csig = csig.to_expr
|
2172
|
-
# puts "csig=#{csig} i=#{i}"
|
2173
2275
|
# puts "systemT inputs=#{systemT.each_input.to_a.size}"
|
2174
2276
|
# Gets i-est signal to connect
|
2175
2277
|
ssig = self.systemT.get_interface_with_included(i)
|
@@ -2181,8 +2283,10 @@ module HDLRuby::High
|
|
2181
2283
|
# Make the connection.
|
2182
2284
|
if isout then
|
2183
2285
|
csig <= ssig
|
2286
|
+
# csig.to_ref <= ssig
|
2184
2287
|
else
|
2185
2288
|
ssig <= csig
|
2289
|
+
# ssig <= csig.to_expr
|
2186
2290
|
end
|
2187
2291
|
end
|
2188
2292
|
end
|
@@ -2199,6 +2303,8 @@ module HDLRuby::High
|
|
2199
2303
|
# NOTE: actually executes +ruby_block+ in the context of the
|
2200
2304
|
# systemT.
|
2201
2305
|
def open(&ruby_block)
|
2306
|
+
# Ensure there is a block.
|
2307
|
+
ruby_block = proc {} unless block_given?
|
2202
2308
|
# Extend the eigen system.
|
2203
2309
|
@systemT.run(&ruby_block)
|
2204
2310
|
# Update the methods.
|
@@ -2260,7 +2366,15 @@ module HDLRuby::High
|
|
2260
2366
|
# system type.
|
2261
2367
|
def method_missing(m, *args, &ruby_block)
|
2262
2368
|
# print "method_missing in class=#{self.class} with m=#{m}\n"
|
2263
|
-
|
2369
|
+
# Maybe its a signal reference.
|
2370
|
+
signal = self.systemT.get_signal_with_included(m)
|
2371
|
+
if signal then
|
2372
|
+
# Yes, create the reference.
|
2373
|
+
return RefObject.new(self.to_ref,signal)
|
2374
|
+
else
|
2375
|
+
# No try elsewhere
|
2376
|
+
self.public_namespace.send(m,*args,&ruby_block)
|
2377
|
+
end
|
2264
2378
|
end
|
2265
2379
|
|
2266
2380
|
|
@@ -2395,6 +2509,8 @@ module HDLRuby::High
|
|
2395
2509
|
#
|
2396
2510
|
# Can only be used once.
|
2397
2511
|
def helse(mode = nil, &ruby_block)
|
2512
|
+
# Ensure there is a block.
|
2513
|
+
ruby_block = proc {} unless block_given?
|
2398
2514
|
# If there is a no block, it is an error.
|
2399
2515
|
raise AnyError, "Cannot have two helse for a single if statement." if self.no
|
2400
2516
|
# Create the no block if required
|
@@ -2409,6 +2525,8 @@ module HDLRuby::High
|
|
2409
2525
|
#
|
2410
2526
|
# Can only be used if the no-block is not set yet.
|
2411
2527
|
def helsif(next_cond, mode = nil, &ruby_block)
|
2528
|
+
# Ensure there is a block.
|
2529
|
+
ruby_block = proc {} unless block_given?
|
2412
2530
|
# If there is a no block, it is an error.
|
2413
2531
|
raise AnyError, "Cannot have an helsif after an helse." if self.no
|
2414
2532
|
# Create the noif block if required
|
@@ -2477,6 +2595,8 @@ module HDLRuby::High
|
|
2477
2595
|
#
|
2478
2596
|
# Can only be used once for the given +match+.
|
2479
2597
|
def hwhen(match, mode = nil, &ruby_block)
|
2598
|
+
# Ensure there is a block.
|
2599
|
+
ruby_block = proc {} unless block_given?
|
2480
2600
|
# Create the nu block if required
|
2481
2601
|
when_block = High.make_block(mode,&ruby_block)
|
2482
2602
|
# Adds the case.
|
@@ -2488,6 +2608,8 @@ module HDLRuby::High
|
|
2488
2608
|
#
|
2489
2609
|
# Can only be used once.
|
2490
2610
|
def helse(mode = nil, &ruby_block)
|
2611
|
+
# Ensure there is a block.
|
2612
|
+
ruby_block = proc {} unless block_given?
|
2491
2613
|
# Create the nu block if required
|
2492
2614
|
default_block = High.make_block(mode,&ruby_block)
|
2493
2615
|
# Sets the default block.
|
@@ -2731,30 +2853,39 @@ module HDLRuby::High
|
|
2731
2853
|
return self.ljust(self[-1])
|
2732
2854
|
end
|
2733
2855
|
|
2734
|
-
# Match the type with +typ+:
|
2735
|
-
# - Recurse on the sub expr if hierachical type, raising an
|
2736
|
-
# if the expression is not hierarchical.
|
2737
|
-
# - Directly cast otherwise.
|
2856
|
+
# # Match the type with +typ+:
|
2857
|
+
# # - Recurse on the sub expr if hierachical type, raising an error
|
2858
|
+
# # if the expression is not hierarchical.
|
2859
|
+
# # - Directly cast otherwise.
|
2860
|
+
# def match_type(typ)
|
2861
|
+
# # Has the type sub types?
|
2862
|
+
# if typ.types? then
|
2863
|
+
# unless self.is_a?(Concat) then
|
2864
|
+
# raise AnyError,
|
2865
|
+
# "Invalid class for assignment to hierarchical: #{self.class}."
|
2866
|
+
# end
|
2867
|
+
# return Concat.new(typ,
|
2868
|
+
# self.each_expression.zip(typ.each_type).map do |e,t|
|
2869
|
+
# e.match_type(t)
|
2870
|
+
# end)
|
2871
|
+
# elsif typ.vector? && typ.base.hierarchical? then
|
2872
|
+
# unless self.is_a?(Concat) then
|
2873
|
+
# raise AnyError,
|
2874
|
+
# "Invalid class for assignment to hierarchical: #{self.class}."
|
2875
|
+
# end
|
2876
|
+
# return Concat.new(typ,
|
2877
|
+
# self.each_expression.map do |e|
|
2878
|
+
# e.match_type(typ.base)
|
2879
|
+
# end)
|
2880
|
+
# else
|
2881
|
+
# return self.as(typ)
|
2882
|
+
# end
|
2883
|
+
# end
|
2884
|
+
|
2885
|
+
# Match the type with +typ+: cast if different type.
|
2738
2886
|
def match_type(typ)
|
2739
|
-
|
2740
|
-
|
2741
|
-
unless self.is_a?(Concat) then
|
2742
|
-
raise AnyError,
|
2743
|
-
"Invalid class for assignment to hierarchical: #{self.class}."
|
2744
|
-
end
|
2745
|
-
return Concat.new(typ,
|
2746
|
-
self.each_expression.zip(typ.each_type).map do |e,t|
|
2747
|
-
e.match_type(t)
|
2748
|
-
end)
|
2749
|
-
elsif typ.vector? && typ.base.hierarchical? then
|
2750
|
-
unless self.is_a?(Concat) then
|
2751
|
-
raise AnyError,
|
2752
|
-
"Invalid class for assignment to hierarchical: #{self.class}."
|
2753
|
-
end
|
2754
|
-
return Concat.new(typ,
|
2755
|
-
self.each_expression.map do |e|
|
2756
|
-
e.match_type(typ.base)
|
2757
|
-
end)
|
2887
|
+
if self.type.eql?(typ) then
|
2888
|
+
return self
|
2758
2889
|
else
|
2759
2890
|
return self.as(typ)
|
2760
2891
|
end
|
@@ -2831,54 +2962,58 @@ module HDLRuby::High
|
|
2831
2962
|
define_method(orig_operator(operator),&meth)
|
2832
2963
|
end
|
2833
2964
|
|
2834
|
-
# Creates an access to elements of range +rng+ of the signal.
|
2835
|
-
#
|
2836
|
-
# NOTE: +rng+ can be a single expression in which case it is an index.
|
2837
|
-
def [](rng)
|
2838
|
-
if rng.is_a?(::Range) then
|
2839
|
-
first = rng.first
|
2840
|
-
if (first.is_a?(::Integer)) then
|
2841
|
-
first = self.type.size+first if first < 0
|
2842
|
-
end
|
2843
|
-
last = rng.last
|
2844
|
-
if (last.is_a?(::Integer)) then
|
2845
|
-
last = self.type.size+last if last < 0
|
2846
|
-
end
|
2847
|
-
rng = first..last
|
2848
|
-
end
|
2849
|
-
if rng.is_a?(::Integer) && rng < 0 then
|
2850
|
-
rng = self.type.size+rng
|
2851
|
-
end
|
2852
|
-
if rng.respond_to?(:to_expr) then
|
2853
|
-
# Number range: convert it to an expression.
|
2854
|
-
rng = rng.to_expr
|
2855
|
-
end
|
2856
|
-
if rng.is_a?(HDLRuby::Low::Expression) then
|
2857
|
-
# Index case
|
2858
|
-
return RefIndex.new(self.type.base,self.to_expr,rng)
|
2859
|
-
else
|
2860
|
-
# Range case, ensure it is made among expression.
|
2861
|
-
first = rng.first.to_expr
|
2862
|
-
last = rng.last.to_expr
|
2863
|
-
# Abd create the reference.
|
2864
|
-
return RefRange.new(self.type.slice(first..last),
|
2865
|
-
self.to_expr,first..last)
|
2866
|
-
end
|
2867
|
-
end
|
2868
2965
|
|
2869
|
-
|
2870
|
-
|
2871
|
-
|
2872
|
-
|
2873
|
-
|
2874
|
-
|
2875
|
-
|
2876
|
-
|
2877
|
-
|
2878
|
-
|
2879
|
-
|
2880
|
-
|
2881
|
-
|
2966
|
+
# Creates an access to elements of range +rng+ of the signal.
|
2967
|
+
#
|
2968
|
+
# NOTE: +rng+ can be a single expression in which case it is an index.
|
2969
|
+
def [](rng)
|
2970
|
+
if rng.is_a?(::Range) then
|
2971
|
+
first = rng.first
|
2972
|
+
if (first.is_a?(::Integer)) then
|
2973
|
+
first = self.type.size+first if first < 0
|
2974
|
+
end
|
2975
|
+
last = rng.last
|
2976
|
+
if (last.is_a?(::Integer)) then
|
2977
|
+
last = self.type.size+last if last < 0
|
2978
|
+
end
|
2979
|
+
rng = first..last
|
2980
|
+
end
|
2981
|
+
if rng.is_a?(::Integer) && rng < 0 then
|
2982
|
+
rng = self.type.size+rng
|
2983
|
+
end
|
2984
|
+
if rng.respond_to?(:to_expr) then
|
2985
|
+
# Number range: convert it to an expression.
|
2986
|
+
rng = rng.to_expr
|
2987
|
+
end
|
2988
|
+
if rng.is_a?(HDLRuby::Low::Expression) then
|
2989
|
+
# Index case
|
2990
|
+
return RefIndex.new(self.type.base,self.to_expr,rng)
|
2991
|
+
else
|
2992
|
+
# Range case, ensure it is made among expression.
|
2993
|
+
first = rng.first.to_expr
|
2994
|
+
last = rng.last.to_expr
|
2995
|
+
# Abd create the reference.
|
2996
|
+
return RefRange.new(self.type.slice(first..last),
|
2997
|
+
self.to_expr,first..last)
|
2998
|
+
end
|
2999
|
+
end
|
3000
|
+
|
3001
|
+
# And save it so that it can still be accessed if overidden.
|
3002
|
+
alias_method orig_operator(:[]), :[]
|
3003
|
+
|
3004
|
+
# Converts to a select operator using current expression as
|
3005
|
+
# condition for one of the +choices+.
|
3006
|
+
#
|
3007
|
+
# NOTE: +choices+ can either be a list of arguments or an array.
|
3008
|
+
# If +choices+ has only two entries
|
3009
|
+
# (and it is not a hash), +value+ will be converted to a boolean.
|
3010
|
+
def mux(*choices)
|
3011
|
+
# Process the choices.
|
3012
|
+
choices = choices.flatten(1) if choices.size == 1
|
3013
|
+
choices.map! { |choice| choice.to_expr }
|
3014
|
+
# Generate the select expression.
|
3015
|
+
return Select.new(choices[0].type,"?",self.to_expr,*choices)
|
3016
|
+
end
|
2882
3017
|
|
2883
3018
|
|
2884
3019
|
|
@@ -2922,19 +3057,25 @@ module HDLRuby::High
|
|
2922
3057
|
#
|
2923
3058
|
# NOTE: it is converted afterward to an expression if required.
|
2924
3059
|
def <=(expr)
|
3060
|
+
# Generate a ref from self for the left of the transmit.
|
3061
|
+
left = self.to_ref
|
2925
3062
|
# Cast expr to self if required.
|
2926
|
-
expr = expr.to_expr.match_type(
|
3063
|
+
expr = expr.to_expr.match_type(left.type)
|
3064
|
+
# Ensure expr is an expression.
|
3065
|
+
expr = expr.to_expr
|
3066
|
+
# Cast it to left if necessary.
|
3067
|
+
expr = expr.as(left.type) unless expr.type.eql?(left.type)
|
2927
3068
|
# Generate the transmit.
|
2928
3069
|
if High.top_user.is_a?(HDLRuby::Low::Block) then
|
2929
3070
|
# We are in a block, so generate and add a Transmit.
|
2930
3071
|
High.top_user.
|
2931
|
-
# add_statement(Transmit.new(self.to_ref,expr
|
2932
|
-
add_statement(Transmit.new(
|
3072
|
+
# add_statement(Transmit.new(self.to_ref,expr))
|
3073
|
+
add_statement(Transmit.new(left,expr))
|
2933
3074
|
else
|
2934
3075
|
# We are in a system type, so generate and add a Connection.
|
2935
3076
|
High.top_user.
|
2936
|
-
# add_connection(Connection.new(self.to_ref,expr
|
2937
|
-
add_connection(Connection.new(
|
3077
|
+
# add_connection(Connection.new(self.to_ref,expr))
|
3078
|
+
add_connection(Connection.new(left,expr))
|
2938
3079
|
end
|
2939
3080
|
end
|
2940
3081
|
end
|
@@ -3185,7 +3326,7 @@ module HDLRuby::High
|
|
3185
3326
|
|
3186
3327
|
# Creates a new reference from a +base+ reference and named +object+.
|
3187
3328
|
def initialize(base,object)
|
3188
|
-
# puts "New RefObjet with base=#{base}, object=#{object
|
3329
|
+
# puts "New RefObjet with base=#{base}, object=#{object}"
|
3189
3330
|
if object.respond_to?(:type) then
|
3190
3331
|
# Typed object, so typed reference.
|
3191
3332
|
super(object.type)
|
@@ -3202,6 +3343,11 @@ module HDLRuby::High
|
|
3202
3343
|
@object = object
|
3203
3344
|
end
|
3204
3345
|
|
3346
|
+
# Clones.
|
3347
|
+
def clone
|
3348
|
+
return RefObject.new(self.base.clone,self.object)
|
3349
|
+
end
|
3350
|
+
|
3205
3351
|
# Tell if the expression is constant.
|
3206
3352
|
def constant?
|
3207
3353
|
return self.base.constant?
|
@@ -3351,6 +3497,11 @@ module HDLRuby::High
|
|
3351
3497
|
High = HDLRuby::High
|
3352
3498
|
include HRef
|
3353
3499
|
|
3500
|
+
# Clones.
|
3501
|
+
def clone
|
3502
|
+
return RefThis.new
|
3503
|
+
end
|
3504
|
+
|
3354
3505
|
# Converts to a new reference.
|
3355
3506
|
def to_ref
|
3356
3507
|
return RefThis.new
|
@@ -3859,11 +4010,15 @@ module HDLRuby::High
|
|
3859
4010
|
# Creates a new block with the current mode with possible +name+ and
|
3860
4011
|
# built from +ruby_block+.
|
3861
4012
|
def sub(name = :"", &ruby_block)
|
4013
|
+
# Ensure there is a block.
|
4014
|
+
ruby_block = proc {} unless block_given?
|
3862
4015
|
self.add_block(self.mode,name,&ruby_block)
|
3863
4016
|
end
|
3864
4017
|
|
3865
4018
|
# Adds statements at the top of the block.
|
3866
4019
|
def unshift(&ruby_block)
|
4020
|
+
# Ensure there is a block.
|
4021
|
+
ruby_block = proc {} unless block_given?
|
3867
4022
|
# Create a sub block for the statements.
|
3868
4023
|
block = High.make_block(self.mode,:"",&ruby_block)
|
3869
4024
|
# Unshifts it.
|
@@ -3908,6 +4063,8 @@ module HDLRuby::High
|
|
3908
4063
|
#
|
3909
4064
|
# NOTE: the else part is defined through the helse method.
|
3910
4065
|
def hif(condition, mode = nil, &ruby_block)
|
4066
|
+
# Ensure there is a block.
|
4067
|
+
ruby_block = proc {} unless block_given?
|
3911
4068
|
# Creates the if statement.
|
3912
4069
|
self.add_statement(If.new(condition,mode,&ruby_block))
|
3913
4070
|
end
|
@@ -3917,6 +4074,8 @@ module HDLRuby::High
|
|
3917
4074
|
#
|
3918
4075
|
# Can only be used once.
|
3919
4076
|
def helse(mode = nil, &ruby_block)
|
4077
|
+
# Ensure there is a block.
|
4078
|
+
ruby_block = proc {} unless block_given?
|
3920
4079
|
# There is a ruby_block: the helse is assumed to be with
|
3921
4080
|
# the hif in the same block.
|
3922
4081
|
# Completes the hif or the hcase statement.
|
@@ -3931,6 +4090,8 @@ module HDLRuby::High
|
|
3931
4090
|
# with a +condition+ that when met lead
|
3932
4091
|
# to the execution of the block in +mode+ generated by the +ruby_block+.
|
3933
4092
|
def helsif(condition, mode = nil, &ruby_block)
|
4093
|
+
# Ensure there is a block.
|
4094
|
+
ruby_block = proc {} unless block_given?
|
3934
4095
|
# There is a ruby_block: the helse is assumed to be with
|
3935
4096
|
# the hif in the same block.
|
3936
4097
|
# Completes the hif statement.
|
@@ -3958,6 +4119,8 @@ module HDLRuby::High
|
|
3958
4119
|
#
|
3959
4120
|
# Can only be used once.
|
3960
4121
|
def hwhen(match, mode = nil, &ruby_block)
|
4122
|
+
# Ensure there is a block.
|
4123
|
+
ruby_block = proc {} unless block_given?
|
3961
4124
|
# There is a ruby_block: the helse is assumed to be with
|
3962
4125
|
# the hif in the same block.
|
3963
4126
|
# Completes the hcase statement.
|
@@ -4073,6 +4236,8 @@ module HDLRuby::High
|
|
4073
4236
|
# Adds a loop until +delay+ statement in the block in +mode+ whose
|
4074
4237
|
# loop content is built using +ruby_block+.
|
4075
4238
|
def repeat(delay, mode = nil, &ruby_block)
|
4239
|
+
# Ensure there is a block.
|
4240
|
+
ruby_block = proc {} unless block_given?
|
4076
4241
|
# Build the content block.
|
4077
4242
|
content = High.make_block(mode,&ruby_block)
|
4078
4243
|
# Create and add the statement.
|
@@ -4539,13 +4704,19 @@ module HDLRuby::High
|
|
4539
4704
|
# # Use it to create the new value.
|
4540
4705
|
# return Value.new(Bit[bstr.width],self)
|
4541
4706
|
# end
|
4707
|
+
|
4708
|
+
# Tell if the expression can be converted to a value.
|
4709
|
+
def to_value?
|
4710
|
+
return true
|
4711
|
+
end
|
4542
4712
|
|
4543
4713
|
# Converts to a new high-level value.
|
4544
4714
|
def to_value
|
4545
4715
|
# Convert the string to a bit string.
|
4546
4716
|
bstr = BitString.new(self)
|
4547
4717
|
# Use it to create the new value.
|
4548
|
-
return Value.new(Bit[bstr.width],
|
4718
|
+
# return Value.new(Bit[bstr.width],bstr)
|
4719
|
+
return Value.new(Bit[self.length],bstr)
|
4549
4720
|
end
|
4550
4721
|
|
4551
4722
|
# Convert to a new high-level string expression
|
@@ -4659,9 +4830,6 @@ module HDLRuby::High
|
|
4659
4830
|
|
4660
4831
|
# Converts to a new high-level expression.
|
4661
4832
|
def to_expr
|
4662
|
-
# expr = Concat.new(TypeTuple.new(:"",:little,*self.map do |elem|
|
4663
|
-
# elem.to_expr.type
|
4664
|
-
# end))
|
4665
4833
|
elems = self.map {|elem| elem.to_expr }
|
4666
4834
|
typ= TypeTuple.new(:"",:little)
|
4667
4835
|
elems.each {|elem| typ.add_type(elem.type) }
|
@@ -4672,7 +4840,6 @@ module HDLRuby::High
|
|
4672
4840
|
|
4673
4841
|
# Converts to a new high-level reference.
|
4674
4842
|
def to_ref
|
4675
|
-
# expr = RefConcat.new
|
4676
4843
|
expr = RefConcat.new(TypeTuple.new(:"",:little,*self.map do |elem|
|
4677
4844
|
elem.to_ref.type
|
4678
4845
|
end))
|
@@ -4731,16 +4898,19 @@ module HDLRuby::High
|
|
4731
4898
|
# Creates a hcase statement executing +ruby_block+ on the element of
|
4732
4899
|
# the array selected by +value+
|
4733
4900
|
def hcase(value,&ruby_block)
|
4901
|
+
# Ensure there is a block.
|
4902
|
+
ruby_block = proc {} unless block_given?
|
4734
4903
|
High.cur_block.hcase(value)
|
4735
4904
|
self.each.with_index do |elem,i|
|
4736
4905
|
High.cur_block.hwhen(i) { ruby_block.call(elem) }
|
4737
4906
|
end
|
4738
4907
|
end
|
4739
4908
|
|
4740
|
-
#
|
4741
|
-
|
4742
|
-
|
4743
|
-
|
4909
|
+
# Moved to HArrow.
|
4910
|
+
# # Add support of the left arrow operator.
|
4911
|
+
# def <=(expr)
|
4912
|
+
# self.to_expr <= expr
|
4913
|
+
# end
|
4744
4914
|
|
4745
4915
|
# Array construction shortcuts
|
4746
4916
|
|