HDLRuby 3.0.0 → 3.2.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 +149 -79
- data/ext/hruby_sim/hruby_rcsim_build.c +2 -0
- data/ext/hruby_sim/hruby_sim_calc.c +33 -6
- data/ext/hruby_sim/hruby_sim_tree_calc.c +111 -22
- data/lib/HDLRuby/hdr_samples/comparison_bench.rb +2 -2
- data/lib/HDLRuby/hdr_samples/constant_in_function.rb +2 -1
- data/lib/HDLRuby/hdr_samples/counter_bench.rb +1 -1
- data/lib/HDLRuby/hdr_samples/counter_dff_bench.rb +8 -7
- data/lib/HDLRuby/hdr_samples/dff_properties.rb +2 -0
- data/lib/HDLRuby/hdr_samples/enum_as_param.rb +52 -0
- data/lib/HDLRuby/hdr_samples/linear_test.rb +2 -0
- data/lib/HDLRuby/hdr_samples/logic_bench.rb +6 -0
- data/lib/HDLRuby/hdr_samples/mei8.rb +6 -6
- data/lib/HDLRuby/hdr_samples/mei8_bench.rb +6 -6
- data/lib/HDLRuby/hdr_samples/memory_test.rb +2 -0
- data/lib/HDLRuby/hdr_samples/named_sub.rb +9 -5
- data/lib/HDLRuby/hdr_samples/ram.rb +7 -6
- data/lib/HDLRuby/hdr_samples/ruby_fir_hw.rb +2 -0
- data/lib/HDLRuby/hdr_samples/struct.rb +15 -3
- data/lib/HDLRuby/hdr_samples/with_bram.rb +1 -1
- data/lib/HDLRuby/hdr_samples/with_bram_frame_stack.rb +1 -1
- data/lib/HDLRuby/hdr_samples/with_bram_stack.rb +1 -1
- data/lib/HDLRuby/hdr_samples/with_channel.rb +2 -0
- data/lib/HDLRuby/hdr_samples/with_channel_other.rb +2 -0
- data/lib/HDLRuby/hdr_samples/with_class.rb +3 -1
- data/lib/HDLRuby/hdr_samples/with_connector.rb +2 -0
- data/lib/HDLRuby/hdr_samples/with_connector_memory.rb +2 -0
- data/lib/HDLRuby/hdr_samples/with_fixpoint.rb +6 -0
- data/lib/HDLRuby/hdr_samples/with_fixpoint_adv.rb +73 -0
- data/lib/HDLRuby/hdr_samples/with_leftright.rb +1 -1
- data/lib/HDLRuby/hdr_samples/with_ref_expr.rb +30 -0
- data/lib/HDLRuby/hdr_samples/with_sequencer.rb +49 -37
- data/lib/HDLRuby/hdr_samples/with_sequencer_channel.rb +58 -0
- data/lib/HDLRuby/hdr_samples/with_sequencer_enumerable.rb +113 -69
- data/lib/HDLRuby/hdr_samples/with_sequencer_enumerator.rb +28 -14
- data/lib/HDLRuby/hdr_samples/with_sequencer_func.rb +63 -0
- data/lib/HDLRuby/hdr_samples/with_sequencer_sync.rb +2 -1
- data/lib/HDLRuby/hdrcc.rb +13 -1
- data/lib/HDLRuby/hruby_high.rb +105 -31
- data/lib/HDLRuby/hruby_low.rb +127 -3
- data/lib/HDLRuby/hruby_low2programs.rb +47 -0
- data/lib/HDLRuby/hruby_low_resolve.rb +3 -2
- data/lib/HDLRuby/hruby_low_without_namespace.rb +133 -5
- data/lib/HDLRuby/hruby_low_without_subsignals.rb +51 -12
- data/lib/HDLRuby/hruby_rcsim.rb +24 -1
- data/lib/HDLRuby/hruby_serializer.rb +2 -1
- data/lib/HDLRuby/hruby_types.rb +5 -5
- data/lib/HDLRuby/hruby_values.rb +7 -7
- data/lib/HDLRuby/hruby_verilog.rb +193 -35
- data/lib/HDLRuby/hruby_verilog_name.rb +35 -42
- data/lib/HDLRuby/std/fixpoint.rb +2 -2
- data/lib/HDLRuby/std/fsm.rb +10 -1
- data/lib/HDLRuby/std/function_generator.rb +1 -1
- data/lib/HDLRuby/std/linear.rb +7 -7
- data/lib/HDLRuby/std/sequencer.rb +538 -60
- data/lib/HDLRuby/std/sequencer_channel.rb +90 -0
- data/lib/HDLRuby/std/sequencer_func.rb +546 -0
- data/lib/HDLRuby/std/std.rb +2 -0
- data/lib/HDLRuby/version.rb +1 -1
- data/tuto/tutorial_sw.md +267 -61
- metadata +25 -4
- data/lib/HDLRuby/hdr_samples/with_register_stack.rb +0 -150
data/lib/HDLRuby/hdrcc.rb
CHANGED
|
@@ -84,6 +84,10 @@ require 'HDLRuby/backend/hruby_c_allocator'
|
|
|
84
84
|
|
|
85
85
|
require 'HDLRuby/version.rb'
|
|
86
86
|
|
|
87
|
+
# Global flags
|
|
88
|
+
$sim = false # Tells if hdrcc is in simulation mode
|
|
89
|
+
$gen = false # Tells if hdrcc is in hardware generation mode
|
|
90
|
+
|
|
87
91
|
|
|
88
92
|
##
|
|
89
93
|
# HDLRuby compiler interface program
|
|
@@ -373,19 +377,23 @@ $optparse = OptionParser.new do |opts|
|
|
|
373
377
|
opts.on("-S","--sim","Default simulator (hybrid C-Ruby)") do |v|
|
|
374
378
|
$options[:rcsim] = v
|
|
375
379
|
$options[:multiple] = v
|
|
380
|
+
$sim = true
|
|
376
381
|
end
|
|
377
382
|
opts.on("--csim","Standalone C-based simulator") do |v|
|
|
378
383
|
$options[:clang] = v
|
|
379
384
|
$options[:multiple] = v
|
|
380
385
|
$options[:csim] = v
|
|
386
|
+
$sim = true
|
|
381
387
|
end
|
|
382
388
|
opts.on("--rsim","Ruby-based simulator") do |v|
|
|
383
389
|
$options[:rsim] = v
|
|
384
390
|
$options[:multiple] = v
|
|
391
|
+
$sim = true
|
|
385
392
|
end
|
|
386
393
|
opts.on("--rcsim","Hybrid C-Ruby-based simulator") do |v|
|
|
387
394
|
$options[:rcsim] = v
|
|
388
395
|
$options[:multiple] = v
|
|
396
|
+
$sim = true
|
|
389
397
|
end
|
|
390
398
|
opts.on("--mute", "The simulator will not generate any output") do |v|
|
|
391
399
|
$options[:mute] = v
|
|
@@ -396,12 +404,14 @@ $optparse = OptionParser.new do |opts|
|
|
|
396
404
|
opts.on("-v", "--verilog","Output in Verlog HDL format") do |v|
|
|
397
405
|
$options[:verilog] = v
|
|
398
406
|
$options[:multiple] = v
|
|
407
|
+
$gen = true
|
|
399
408
|
end
|
|
400
409
|
opts.on("-V", "--vhdl","Output in VHDL format") do |v|
|
|
401
410
|
HDLRuby::Low::Low2VHDL.vhdl08 = false
|
|
402
411
|
$options[:vhdl] = v
|
|
403
412
|
$options[:multiple] = v
|
|
404
413
|
$options[:vhdl08] = false
|
|
414
|
+
$gen = true
|
|
405
415
|
end
|
|
406
416
|
opts.on("-A", "--alliance","Output in Alliance-compatible VHDL format") do |v|
|
|
407
417
|
HDLRuby::Low::Low2VHDL.vhdl08 = false
|
|
@@ -410,12 +420,14 @@ $optparse = OptionParser.new do |opts|
|
|
|
410
420
|
$options[:alliance] = v
|
|
411
421
|
$options[:multiple] = v
|
|
412
422
|
$options[:vhdl08] = false
|
|
423
|
+
$gen = true
|
|
413
424
|
end
|
|
414
425
|
opts.on("-U", "--vhdl08","Output in VHDL'08 format") do |v|
|
|
415
426
|
HDLRuby::Low::Low2VHDL.vhdl08 = true
|
|
416
427
|
$options[:vhdl] = v
|
|
417
428
|
$options[:multiple] = v
|
|
418
429
|
$options[:vhdl08] = true
|
|
430
|
+
$gen = true
|
|
419
431
|
end
|
|
420
432
|
opts.on("-s", "--syntax","Output the Ruby syntax tree") do |s|
|
|
421
433
|
$options[:syntax] = s
|
|
@@ -821,7 +833,7 @@ elsif $options[:verilog] then
|
|
|
821
833
|
$top_system.each_systemT_deep do |systemT|
|
|
822
834
|
HDLRuby.show? "signal2subs step..."
|
|
823
835
|
# Ensure there is not implicit assign to sub signals.
|
|
824
|
-
systemT.signal2subs!
|
|
836
|
+
systemT.signal2subs!(true)
|
|
825
837
|
# HDLRuby.show "casts_without_expression! step..."
|
|
826
838
|
# systemT.casts_without_expression!
|
|
827
839
|
# HDLRuby.show Time.now
|
data/lib/HDLRuby/hruby_high.rb
CHANGED
|
@@ -880,9 +880,11 @@ module HDLRuby::High
|
|
|
880
880
|
"Cannot convert a system without a name to HDLRuby::Low."
|
|
881
881
|
end
|
|
882
882
|
# Create the resulting low system type.
|
|
883
|
-
# systemTL = HDLRuby::Low::SystemT.new(
|
|
884
|
-
|
|
885
|
-
|
|
883
|
+
# systemTL = HDLRuby::Low::SystemT.new(HDLRuby.uniq_name(name),
|
|
884
|
+
# self.scope.to_low)
|
|
885
|
+
systemTLN = HDLRuby.uniq_name(name)
|
|
886
|
+
systemTL = HDLRuby::Low::SystemT.new(systemTLN,
|
|
887
|
+
self.scope.to_low(systemTLN))
|
|
886
888
|
# puts "New low from system #{self.name}: #{systemTL.name}"
|
|
887
889
|
# # For debugging: set the source high object
|
|
888
890
|
# systemTL.properties[:low2high] = self.hdr_id
|
|
@@ -1168,6 +1170,17 @@ module HDLRuby::High
|
|
|
1168
1170
|
self.parent.inout(*names)
|
|
1169
1171
|
end
|
|
1170
1172
|
|
|
1173
|
+
# Declares a program in language +lang+ with start function named +func+
|
|
1174
|
+
# and accessed expressions an code given in +args+.
|
|
1175
|
+
def program(lang, func, *args)
|
|
1176
|
+
# Create the program.
|
|
1177
|
+
prog = Program.new(lang, func, *args)
|
|
1178
|
+
# Adds the resulting program to the current scope.
|
|
1179
|
+
HDLRuby::High.top_user.add_program(prog)
|
|
1180
|
+
# Return the resulting program
|
|
1181
|
+
return prog
|
|
1182
|
+
end
|
|
1183
|
+
|
|
1171
1184
|
# Declares a non-HDLRuby set of code chunks described by +content+ and
|
|
1172
1185
|
# completed from +ruby_block+ execution result.
|
|
1173
1186
|
# NOTE: content includes the events to activate the code on and
|
|
@@ -1512,6 +1525,8 @@ module HDLRuby::High
|
|
|
1512
1525
|
scopeL.add_systemT(systemI_low.systemT)
|
|
1513
1526
|
}
|
|
1514
1527
|
end
|
|
1528
|
+
# Adds the programs.
|
|
1529
|
+
self.each_program { |prog| scopeL.add_program(prog.to_low) }
|
|
1515
1530
|
# Adds the code chunks.
|
|
1516
1531
|
self.each_code { |code| scopeL.add_code(code.to_low) }
|
|
1517
1532
|
# Adds the connections.
|
|
@@ -1526,10 +1541,15 @@ module HDLRuby::High
|
|
|
1526
1541
|
end
|
|
1527
1542
|
|
|
1528
1543
|
# Converts the scope to HDLRuby::Low.
|
|
1529
|
-
|
|
1544
|
+
# +name+ is the name of the system containing the new low scope in case
|
|
1545
|
+
# of top scope, should be used as name for it.
|
|
1546
|
+
# NOTE: by convention, the name of the top scope is the name of the
|
|
1547
|
+
# system.
|
|
1548
|
+
def to_low(low_name = nil)
|
|
1530
1549
|
# Create the resulting low scope.
|
|
1531
1550
|
# scopeL = HDLRuby::Low::Scope.new()
|
|
1532
|
-
|
|
1551
|
+
low_name = self.name unless low_name
|
|
1552
|
+
scopeL = HDLRuby::Low::Scope.new(low_name)
|
|
1533
1553
|
# # For debugging: set the source high object
|
|
1534
1554
|
# scopeL.properties[:low2high] = self.hdr_id
|
|
1535
1555
|
# self.properties[:high2low] = scopeL
|
|
@@ -1974,7 +1994,7 @@ module HDLRuby::High
|
|
|
1974
1994
|
raise AnyError, "Generic type #{self.name} did not produce a valid type: #{gtype.class}"
|
|
1975
1995
|
end
|
|
1976
1996
|
# Create a new type definition from it.
|
|
1977
|
-
gtype = TypeDef.new(self.name.to_s + "_#{args.join(
|
|
1997
|
+
gtype = TypeDef.new(self.name.to_s + "_#{args.join(':')}",
|
|
1978
1998
|
gtype)
|
|
1979
1999
|
# Adds the possible overloaded operators.
|
|
1980
2000
|
self.each_overload do |op,ruby_block|
|
|
@@ -2168,6 +2188,7 @@ module HDLRuby::High
|
|
|
2168
2188
|
|
|
2169
2189
|
# Methods for declaring systems
|
|
2170
2190
|
|
|
2191
|
+
|
|
2171
2192
|
# Declares a high-level system type named +name+, with +includes+ mixins
|
|
2172
2193
|
# system types and using +ruby_block+ for instantiating.
|
|
2173
2194
|
def system(name = :"", *includes, &ruby_block)
|
|
@@ -2198,29 +2219,48 @@ module HDLRuby::High
|
|
|
2198
2219
|
#
|
|
2199
2220
|
# NOTE: a function is a short-cut for a method that creates a scope.
|
|
2200
2221
|
def function(name, &ruby_block)
|
|
2222
|
+
warn("Construct 'function' is deprecated, use 'hdef' instead.")
|
|
2201
2223
|
# Ensure there is a block.
|
|
2202
2224
|
ruby_block = proc {} unless block_given?
|
|
2203
2225
|
if HDLRuby::High.in_system? then
|
|
2204
2226
|
define_singleton_method(name.to_sym) do |*args,&other_block|
|
|
2205
|
-
# sub do
|
|
2206
2227
|
sub(HDLRuby.uniq_name(name)) do
|
|
2207
2228
|
HDLRuby::High.top_user.instance_exec(*args,*other_block,
|
|
2208
2229
|
&ruby_block)
|
|
2209
|
-
# ruby_block.call(*args)
|
|
2210
2230
|
end
|
|
2211
2231
|
end
|
|
2212
2232
|
else
|
|
2213
2233
|
define_method(name.to_sym) do |*args,&other_block|
|
|
2214
|
-
# sub do
|
|
2215
2234
|
sub(HDLRuby.uniq_name(name)) do
|
|
2216
2235
|
HDLRuby::High.top_user.instance_exec(*args,*other_block,
|
|
2217
2236
|
&ruby_block)
|
|
2218
|
-
# ruby_block.call(*args,*other_block)
|
|
2219
2237
|
end
|
|
2220
2238
|
end
|
|
2221
2239
|
end
|
|
2222
2240
|
end
|
|
2223
2241
|
|
|
2242
|
+
# Declares a function named +name+ using +ruby_block+ as body.
|
|
2243
|
+
#
|
|
2244
|
+
# NOTE: a function is a short-cut for a method that creates a scope.
|
|
2245
|
+
def hdef(name, &ruby_block)
|
|
2246
|
+
# Ensure there is a block.
|
|
2247
|
+
ruby_block = proc {} unless block_given?
|
|
2248
|
+
if HDLRuby::High.in_system? then
|
|
2249
|
+
define_singleton_method(name.to_sym) do |*args,&other_block|
|
|
2250
|
+
sub(HDLRuby.uniq_name(name)) do
|
|
2251
|
+
HDLRuby::High.top_user.instance_exec(*args,*other_block,
|
|
2252
|
+
&ruby_block)
|
|
2253
|
+
end
|
|
2254
|
+
end
|
|
2255
|
+
else
|
|
2256
|
+
define_method(name.to_sym) do |*args,&other_block|
|
|
2257
|
+
sub(HDLRuby.uniq_name(name)) do
|
|
2258
|
+
HDLRuby::High.top_user.instance_exec(*args,*other_block,
|
|
2259
|
+
&ruby_block)
|
|
2260
|
+
end
|
|
2261
|
+
end
|
|
2262
|
+
end
|
|
2263
|
+
end
|
|
2224
2264
|
|
|
2225
2265
|
|
|
2226
2266
|
|
|
@@ -2275,24 +2315,8 @@ module HDLRuby::High
|
|
|
2275
2315
|
# Performs the connections.
|
|
2276
2316
|
connects.each do |key,value|
|
|
2277
2317
|
# Gets the signal corresponding to connect.
|
|
2278
|
-
# signal = self.get_signal(key)
|
|
2279
|
-
# unless signal then
|
|
2280
|
-
# # Look into the included systems.
|
|
2281
|
-
# self.systemT.scope.each_included do |included|
|
|
2282
|
-
# signal = included.get_signal(key)
|
|
2283
|
-
# break if signal
|
|
2284
|
-
# end
|
|
2285
|
-
# end
|
|
2286
2318
|
signal = self.systemT.get_signal_with_included(key)
|
|
2287
2319
|
# Check if it is an output.
|
|
2288
|
-
# isout = self.get_output(key)
|
|
2289
|
-
# unless isout then
|
|
2290
|
-
# # Look into the inlucded systems.
|
|
2291
|
-
# self.systemT.scope.each_included do |included|
|
|
2292
|
-
# isout = included.get_output(key)
|
|
2293
|
-
# break if isout
|
|
2294
|
-
# end
|
|
2295
|
-
# end
|
|
2296
2320
|
isout = self.systemT.get_output_with_included(key)
|
|
2297
2321
|
# Convert it to a reference.
|
|
2298
2322
|
# puts "key=#{key} value=#{value} signal=#{signal}"
|
|
@@ -2422,7 +2446,6 @@ module HDLRuby::High
|
|
|
2422
2446
|
|
|
2423
2447
|
# Gets the private namespace.
|
|
2424
2448
|
def namespace
|
|
2425
|
-
# self.systemT.scope.namespace
|
|
2426
2449
|
self.systemT.namespace
|
|
2427
2450
|
end
|
|
2428
2451
|
|
|
@@ -2473,6 +2496,25 @@ module HDLRuby::High
|
|
|
2473
2496
|
end
|
|
2474
2497
|
end
|
|
2475
2498
|
|
|
2499
|
+
|
|
2500
|
+
|
|
2501
|
+
|
|
2502
|
+
##
|
|
2503
|
+
# Describes a program.
|
|
2504
|
+
class Program < HDLRuby::Low::Program
|
|
2505
|
+
# Converts the if to HDLRuby::Low.
|
|
2506
|
+
def to_low
|
|
2507
|
+
# Create the resulting program.
|
|
2508
|
+
progL = HDLRuby::Low::Program.new(self.lang,self.function,
|
|
2509
|
+
*self.each_expression.map(&:to_low),
|
|
2510
|
+
*self.each_event.map(&:to_low),
|
|
2511
|
+
*self.each_code)
|
|
2512
|
+
# Return the resulting program.
|
|
2513
|
+
return progL
|
|
2514
|
+
end
|
|
2515
|
+
end
|
|
2516
|
+
|
|
2517
|
+
|
|
2476
2518
|
##
|
|
2477
2519
|
# Decribes a set of non-HDLRuby code chunks.
|
|
2478
2520
|
class Code < HDLRuby::Low::Code
|
|
@@ -3134,7 +3176,6 @@ module HDLRuby::High
|
|
|
3134
3176
|
|
|
3135
3177
|
# Converts the unary expression to HDLRuby::Low.
|
|
3136
3178
|
def to_low
|
|
3137
|
-
# return HDLRuby::Low::Cast.new(self.type.to_low,self.child.to_low)
|
|
3138
3179
|
castL =HDLRuby::Low::Cast.new(self.type.to_low,self.child.to_low)
|
|
3139
3180
|
# # For debugging: set the source high object
|
|
3140
3181
|
# castL.properties[:low2high] = self.hdr_id
|
|
@@ -3318,6 +3359,24 @@ module HDLRuby::High
|
|
|
3318
3359
|
include HExpression
|
|
3319
3360
|
include HArrow
|
|
3320
3361
|
|
|
3362
|
+
# Update the initialize to handle struct types accesses if
|
|
3363
|
+
# it is not a RefObject, this latter being a proxy to a
|
|
3364
|
+
# real component.
|
|
3365
|
+
if klass != RefObject then
|
|
3366
|
+
original_initialize = instance_method(:initialize)
|
|
3367
|
+
define_method(:initialize) do |*args, &block|
|
|
3368
|
+
original_initialize.bind(self).call(*args,&block)
|
|
3369
|
+
# Now process it if it is a structured type.
|
|
3370
|
+
if self.type.struct? then
|
|
3371
|
+
self.type.each do |name,typ|
|
|
3372
|
+
self.define_singleton_method(name) do
|
|
3373
|
+
RefName.new(typ,self,name)
|
|
3374
|
+
end
|
|
3375
|
+
end
|
|
3376
|
+
end
|
|
3377
|
+
end
|
|
3378
|
+
end
|
|
3379
|
+
|
|
3321
3380
|
# Converts to a new expression.
|
|
3322
3381
|
def to_expr
|
|
3323
3382
|
self.to_ref
|
|
@@ -3418,15 +3477,22 @@ module HDLRuby::High
|
|
|
3418
3477
|
# Converts the name reference to a HDLRuby::Low::RefName.
|
|
3419
3478
|
def to_low
|
|
3420
3479
|
# puts "to_low with base=#{@base} @object=#{@object}"
|
|
3421
|
-
# puts "@object.name=#{@object.name}"
|
|
3480
|
+
# puts "@object.name=#{@object.name} @object.parent=#{@object.parent.name}"
|
|
3422
3481
|
if @base.is_a?(RefThis) &&
|
|
3423
3482
|
(@object.parent != High.top_user) &&
|
|
3424
3483
|
(@object.parent != High.cur_system) &&
|
|
3484
|
+
(@object.parent != High.cur_system.scope) &&
|
|
3425
3485
|
(!@object.parent.name.empty?) then
|
|
3426
3486
|
# Need to have a hierachical access.
|
|
3427
|
-
|
|
3428
|
-
|
|
3487
|
+
if @object.respond_to?(:low_object) && @object.low_object then
|
|
3488
|
+
# There where already a low object, create the ref from it.
|
|
3489
|
+
# puts "absolute ref!"
|
|
3490
|
+
refNameL = @object.low_object.absolute_ref
|
|
3491
|
+
else
|
|
3492
|
+
# No create the indirect reference.
|
|
3493
|
+
refNameL = HDLRuby::Low::RefName.new(self.type.to_low,
|
|
3429
3494
|
@object.parent.to_ref.to_low,@object.name)
|
|
3495
|
+
end
|
|
3430
3496
|
else
|
|
3431
3497
|
# Direct access is enough.
|
|
3432
3498
|
refNameL = HDLRuby::Low::RefName.new(self.type.to_low,
|
|
@@ -3954,11 +4020,19 @@ module HDLRuby::High
|
|
|
3954
4020
|
return [obj,self.to_expr]
|
|
3955
4021
|
end
|
|
3956
4022
|
|
|
4023
|
+
# Get the low version off the object.
|
|
4024
|
+
# NOTE: only useful for Signals and SystemIs since they can be accessed
|
|
4025
|
+
# from outside the module they have been defined in.
|
|
4026
|
+
def low_object
|
|
4027
|
+
return @low_object
|
|
4028
|
+
end
|
|
4029
|
+
|
|
3957
4030
|
# Converts the system to HDLRuby::Low and set its +name+.
|
|
3958
4031
|
def to_low(name = self.name)
|
|
3959
4032
|
# return HDLRuby::Low::SignalI.new(name,self.type.to_low)
|
|
3960
4033
|
valueL = self.value ? self.value.to_low : nil
|
|
3961
4034
|
signalIL = HDLRuby::Low::SignalI.new(name,self.type.to_low,valueL)
|
|
4035
|
+
@low_object = signalIL
|
|
3962
4036
|
# Recurse on the sub signals if any.
|
|
3963
4037
|
self.each_signal do |sig|
|
|
3964
4038
|
signalIL.add_signal(sig.to_low)
|
data/lib/HDLRuby/hruby_low.rb
CHANGED
|
@@ -79,6 +79,24 @@ module HDLRuby::Low
|
|
|
79
79
|
end
|
|
80
80
|
return res
|
|
81
81
|
end
|
|
82
|
+
|
|
83
|
+
# Get an absolute reference to the object.
|
|
84
|
+
def absolute_ref
|
|
85
|
+
# Get the full hierarchy up to the object.
|
|
86
|
+
path = self.hierarchy
|
|
87
|
+
# Create the reference.
|
|
88
|
+
# return path.reduce(RefThis.new) do |ref,node|
|
|
89
|
+
return path.reverse_each.reduce(RefThis.new) do |ref,node|
|
|
90
|
+
# puts "node=#{node}"
|
|
91
|
+
# puts "name=#{node.name}" if node.respond_to?(:name)
|
|
92
|
+
if node.respond_to?(:name) then
|
|
93
|
+
typ = node.respond_to?(:type) ? node.type : void
|
|
94
|
+
RefName.new(typ,ref,node.name)
|
|
95
|
+
else
|
|
96
|
+
ref
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
82
100
|
end
|
|
83
101
|
|
|
84
102
|
|
|
@@ -98,7 +116,8 @@ module HDLRuby::Low
|
|
|
98
116
|
attr_reader :scope
|
|
99
117
|
|
|
100
118
|
# Creates a new system type named +name+ with +scope+.
|
|
101
|
-
def initialize(name,scope)
|
|
119
|
+
# def initialize(name,scope)
|
|
120
|
+
def initialize(name,scope = nil)
|
|
102
121
|
# Set the name as a symbol.
|
|
103
122
|
@name = name.to_sym
|
|
104
123
|
|
|
@@ -109,6 +128,13 @@ module HDLRuby::Low
|
|
|
109
128
|
@interface = [] # The interface signals in order of
|
|
110
129
|
# declaration
|
|
111
130
|
|
|
131
|
+
# self.set_scope(scope) if scope
|
|
132
|
+
# end
|
|
133
|
+
|
|
134
|
+
# # Set the scope of the systemT to +scope+.
|
|
135
|
+
# # Note: cannot override an existing scope.
|
|
136
|
+
# def set_scope(scope)
|
|
137
|
+
# raise(AnyError,"Scope already present") if @scope
|
|
112
138
|
# Check the scope
|
|
113
139
|
unless scope.is_a?(Scope)
|
|
114
140
|
raise AnyError,
|
|
@@ -313,7 +339,7 @@ module HDLRuby::Low
|
|
|
313
339
|
# Returns an enumerator if no ruby block is given.
|
|
314
340
|
def each_signal_all(&ruby_block)
|
|
315
341
|
# No ruby block? Return an enumerator.
|
|
316
|
-
return to_enum(:
|
|
342
|
+
return to_enum(:each_signal_all) unless ruby_block
|
|
317
343
|
# A ruby block? Apply it on each signal instance.
|
|
318
344
|
@inputs.each(&ruby_block)
|
|
319
345
|
@outputs.each(&ruby_block)
|
|
@@ -526,6 +552,8 @@ module HDLRuby::Low
|
|
|
526
552
|
@inners = HashName.new
|
|
527
553
|
# Initialize the system instances list.
|
|
528
554
|
@systemIs = HashName.new
|
|
555
|
+
# Initialize the programs list.
|
|
556
|
+
@programs = []
|
|
529
557
|
# Initialize the non-HDLRuby code chunks list.
|
|
530
558
|
@codes = []
|
|
531
559
|
# Initialize the connections list.
|
|
@@ -804,7 +832,40 @@ module HDLRuby::Low
|
|
|
804
832
|
# end
|
|
805
833
|
# systemI
|
|
806
834
|
# end
|
|
835
|
+
|
|
836
|
+
|
|
837
|
+
# Handling the programs.
|
|
838
|
+
|
|
839
|
+
# Adds program +prog+.
|
|
840
|
+
def add_program(prog)
|
|
841
|
+
# Check and add the program.
|
|
842
|
+
unless prog.is_a?(Program)
|
|
843
|
+
raise AnyError,
|
|
844
|
+
"Invalid class for a program: #{prog.class}"
|
|
845
|
+
end
|
|
846
|
+
# Set the parent of the program.
|
|
847
|
+
program.parent = self
|
|
848
|
+
# Add the program.
|
|
849
|
+
@programs << program
|
|
850
|
+
program
|
|
851
|
+
end
|
|
852
|
+
|
|
853
|
+
# Iterates over the programs.
|
|
807
854
|
#
|
|
855
|
+
# Returns an enumerator if no ruby block is given.
|
|
856
|
+
def each_program(&ruby_block)
|
|
857
|
+
# puts "each_program from scope=#{self}"
|
|
858
|
+
# No ruby block? Return an enumerator.
|
|
859
|
+
return to_enum(:each_program) unless ruby_block
|
|
860
|
+
# A ruby block? Apply it on each program.
|
|
861
|
+
@programs.each(&ruby_block)
|
|
862
|
+
end
|
|
863
|
+
|
|
864
|
+
# Tells if there is any program.
|
|
865
|
+
def has_program?
|
|
866
|
+
return !@programs.empty?
|
|
867
|
+
end
|
|
868
|
+
|
|
808
869
|
# Handling the non-HDLRuby code chunks.
|
|
809
870
|
|
|
810
871
|
# Adds code chunk +code+.
|
|
@@ -832,7 +893,7 @@ module HDLRuby::Low
|
|
|
832
893
|
# puts "each_code from scope=#{self}"
|
|
833
894
|
# No ruby block? Return an enumerator.
|
|
834
895
|
return to_enum(:each_code) unless ruby_block
|
|
835
|
-
# A ruby block? Apply it on each
|
|
896
|
+
# A ruby block? Apply it on each code.
|
|
836
897
|
@codes.each(&ruby_block)
|
|
837
898
|
end
|
|
838
899
|
|
|
@@ -2936,6 +2997,69 @@ module HDLRuby::Low
|
|
|
2936
2997
|
end
|
|
2937
2998
|
|
|
2938
2999
|
|
|
3000
|
+
##
|
|
3001
|
+
# Describes a program.
|
|
3002
|
+
class Program
|
|
3003
|
+
|
|
3004
|
+
include Hparent
|
|
3005
|
+
|
|
3006
|
+
attr_reader :language, :function
|
|
3007
|
+
|
|
3008
|
+
# Creates a new program in language +lang+ with start function
|
|
3009
|
+
# named +func+ accessed expressions, events and code files given in
|
|
3010
|
+
# +args+.
|
|
3011
|
+
def initialize(lang,func,*args)
|
|
3012
|
+
# Sets the language.
|
|
3013
|
+
@language = lang.to_sym
|
|
3014
|
+
# Sets the start function.
|
|
3015
|
+
@function = func.to_s
|
|
3016
|
+
# Process the expressions and code files arguments.
|
|
3017
|
+
@exprs = []
|
|
3018
|
+
@events = []
|
|
3019
|
+
@codes = []
|
|
3020
|
+
args.each do |arg|
|
|
3021
|
+
if arg.is_a?(String) then
|
|
3022
|
+
@codes << arg
|
|
3023
|
+
elsif arg.is_a?(Event) then
|
|
3024
|
+
@events << arg
|
|
3025
|
+
else
|
|
3026
|
+
@exprs << arg.to_expr
|
|
3027
|
+
end
|
|
3028
|
+
end
|
|
3029
|
+
end
|
|
3030
|
+
|
|
3031
|
+
# Iterates over each accessed expression.
|
|
3032
|
+
#
|
|
3033
|
+
# Returns an enumerator if no ruby block is given.
|
|
3034
|
+
def each_expression(&ruby_block)
|
|
3035
|
+
# No block? Return an enumerator.
|
|
3036
|
+
return to_enum(:each_expression) unless ruby_block
|
|
3037
|
+
# A block is given, apply it.
|
|
3038
|
+
@exprs.each(&ruby_block)
|
|
3039
|
+
end
|
|
3040
|
+
|
|
3041
|
+
# Iterates over each accessed event.
|
|
3042
|
+
#
|
|
3043
|
+
# Returns an enumerator if no ruby block is given.
|
|
3044
|
+
def each_event(&ruby_block)
|
|
3045
|
+
# No block? Return an enumerator.
|
|
3046
|
+
return to_enum(:each_event) unless ruby_block
|
|
3047
|
+
# A block is given, apply it.
|
|
3048
|
+
@events.each(&ruby_block)
|
|
3049
|
+
end
|
|
3050
|
+
|
|
3051
|
+
# Iterates over each code files.
|
|
3052
|
+
#
|
|
3053
|
+
# Returns an enumerator if no ruby block is given.
|
|
3054
|
+
def each_code(&ruby_block)
|
|
3055
|
+
# No block? Return an enumerator.
|
|
3056
|
+
return to_enum(:each_code) unless ruby_block
|
|
3057
|
+
# A block is given, apply it.
|
|
3058
|
+
@codes.each(&ruby_block)
|
|
3059
|
+
end
|
|
3060
|
+
end
|
|
3061
|
+
|
|
3062
|
+
|
|
2939
3063
|
##
|
|
2940
3064
|
# Decribes a set of non-HDLRuby code chunks.
|
|
2941
3065
|
class Code
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
require 'HDLRuby'
|
|
2
|
+
require 'HDLRuby/hruby_low_with_bool'
|
|
3
|
+
require 'HDLRuby/hruby_low_without_namespace'
|
|
4
|
+
require 'HDLRuby/hruby_low_with_var'
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
module HDLRuby::Low
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
##
|
|
11
|
+
# Converts a HDLRuby::Low description to descriptions of software programs.
|
|
12
|
+
#
|
|
13
|
+
########################################################################
|
|
14
|
+
|
|
15
|
+
## Provides tools for extracting software from HDLRuby description.
|
|
16
|
+
module Low2Programs
|
|
17
|
+
|
|
18
|
+
class SystemT
|
|
19
|
+
## Extends the SystemT class with extraction of software.
|
|
20
|
+
|
|
21
|
+
# Extract the information about the software in the system and put it
|
|
22
|
+
# into +target+ directory.
|
|
23
|
+
def extract_programs(target)
|
|
24
|
+
# Gather the programs descriptions.
|
|
25
|
+
programs = self.scope.each_scope_deep.map do |scope|
|
|
26
|
+
scope.each_program.to_a
|
|
27
|
+
end
|
|
28
|
+
programs.flatten!
|
|
29
|
+
# Sort the programs by language.
|
|
30
|
+
lang2prog = Hash.new([])
|
|
31
|
+
programs.each { |prog| lang2prog[prog.language] << prog }
|
|
32
|
+
# Copy the programs in the corresponding subdirectories.
|
|
33
|
+
lang2prog.each do |lang,progs|
|
|
34
|
+
dir = target + "/" + lang
|
|
35
|
+
Dir.mkdir(dir)
|
|
36
|
+
progs.each do |prog|
|
|
37
|
+
prog.each_code { |code| FileUtils.cp(code,dir) }
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class Scope
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
end
|
|
@@ -233,6 +233,7 @@ module HDLRuby::Low
|
|
|
233
233
|
if self.ref.is_a?(RefName) then
|
|
234
234
|
obj = self.ref.resolve
|
|
235
235
|
# puts "obj=#{obj}"
|
|
236
|
+
return obj if obj.name == self.name
|
|
236
237
|
# Look into the object for the name.
|
|
237
238
|
return obj.get_by_name(self.name)
|
|
238
239
|
else
|
|
@@ -242,9 +243,9 @@ module HDLRuby::Low
|
|
|
242
243
|
while parent
|
|
243
244
|
# puts "parent=#{parent}"
|
|
244
245
|
if parent.respond_to?(:get_by_name) then
|
|
245
|
-
# puts "get_by_name"
|
|
246
|
+
# puts "Going get_by_name with name=#{self.name}"
|
|
246
247
|
found = parent.get_by_name(self.name)
|
|
247
|
-
# puts "found" if found
|
|
248
|
+
# puts "found=#{found}" if found
|
|
248
249
|
return found if found
|
|
249
250
|
end
|
|
250
251
|
parent = parent.parent
|