HDLRuby 2.10.3 → 2.11.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|