HDLRuby 2.0.8
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 +7 -0
- data/.gitignore +9 -0
- data/.travis.yml +5 -0
- data/.yardopts +1 -0
- data/Gemfile +4 -0
- data/HDLRuby.gemspec +36 -0
- data/LICENSE.txt +21 -0
- data/README.md +2774 -0
- data/README.pdf +0 -0
- data/Rakefile +10 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/exe/hdrcc +3 -0
- data/lib/HDLRuby/alcc.rb +137 -0
- data/lib/HDLRuby/backend/hruby_allocator.rb +69 -0
- data/lib/HDLRuby/backend/hruby_c_allocator.rb +76 -0
- data/lib/HDLRuby/hdr_samples/adder.rb +7 -0
- data/lib/HDLRuby/hdr_samples/adder_assign_error.rb +11 -0
- data/lib/HDLRuby/hdr_samples/adder_bench.rb +27 -0
- data/lib/HDLRuby/hdr_samples/adder_gen.rb +7 -0
- data/lib/HDLRuby/hdr_samples/adder_nodef_error.rb +7 -0
- data/lib/HDLRuby/hdr_samples/addsub.rb +19 -0
- data/lib/HDLRuby/hdr_samples/addsubz.rb +22 -0
- data/lib/HDLRuby/hdr_samples/alu.rb +47 -0
- data/lib/HDLRuby/hdr_samples/calculator.rb +48 -0
- data/lib/HDLRuby/hdr_samples/counter_bench.rb +83 -0
- data/lib/HDLRuby/hdr_samples/dff.rb +9 -0
- data/lib/HDLRuby/hdr_samples/dff_bench.rb +66 -0
- data/lib/HDLRuby/hdr_samples/dff_counter.rb +20 -0
- data/lib/HDLRuby/hdr_samples/include.rb +14 -0
- data/lib/HDLRuby/hdr_samples/instance_open.rb +23 -0
- data/lib/HDLRuby/hdr_samples/mei8.rb +256 -0
- data/lib/HDLRuby/hdr_samples/mei8_bench.rb +309 -0
- data/lib/HDLRuby/hdr_samples/multer_gen.rb +8 -0
- data/lib/HDLRuby/hdr_samples/multer_seq.rb +29 -0
- data/lib/HDLRuby/hdr_samples/neural/a.rb +9 -0
- data/lib/HDLRuby/hdr_samples/neural/a_sub.rb +5 -0
- data/lib/HDLRuby/hdr_samples/neural/bw.rb +23 -0
- data/lib/HDLRuby/hdr_samples/neural/counter.rb +16 -0
- data/lib/HDLRuby/hdr_samples/neural/dadz.rb +9 -0
- data/lib/HDLRuby/hdr_samples/neural/dadz_sub.rb +4 -0
- data/lib/HDLRuby/hdr_samples/neural/forward.rb +153 -0
- data/lib/HDLRuby/hdr_samples/neural/forward_sub.rb +62 -0
- data/lib/HDLRuby/hdr_samples/neural/forward_sub_rand.rb +41 -0
- data/lib/HDLRuby/hdr_samples/neural/forward_sub_rand_typedef.rb +47 -0
- data/lib/HDLRuby/hdr_samples/neural/mem.rb +30 -0
- data/lib/HDLRuby/hdr_samples/neural/random.rb +23 -0
- data/lib/HDLRuby/hdr_samples/neural/selector.rb +29 -0
- data/lib/HDLRuby/hdr_samples/neural/sigmoid.rb +20 -0
- data/lib/HDLRuby/hdr_samples/neural/z.rb +33 -0
- data/lib/HDLRuby/hdr_samples/prog.obj +256 -0
- data/lib/HDLRuby/hdr_samples/ram.rb +18 -0
- data/lib/HDLRuby/hdr_samples/register_with_code_bench.rb +98 -0
- data/lib/HDLRuby/hdr_samples/rom.rb +10 -0
- data/lib/HDLRuby/hdr_samples/struct.rb +14 -0
- data/lib/HDLRuby/hdr_samples/sumprod.rb +29 -0
- data/lib/HDLRuby/hdr_samples/sw_encrypt_bench.rb +103 -0
- data/lib/HDLRuby/hdr_samples/sw_encrypt_cpu_bench.rb +261 -0
- data/lib/HDLRuby/hdr_samples/sw_encrypt_cpusim_bench.rb +302 -0
- data/lib/HDLRuby/hdr_samples/system_open.rb +11 -0
- data/lib/HDLRuby/hdr_samples/tuple.rb +16 -0
- data/lib/HDLRuby/hdr_samples/with_channel.rb +118 -0
- data/lib/HDLRuby/hdr_samples/with_class.rb +199 -0
- data/lib/HDLRuby/hdr_samples/with_decoder.rb +17 -0
- data/lib/HDLRuby/hdr_samples/with_fsm.rb +34 -0
- data/lib/HDLRuby/hdr_samples/with_reconf.rb +103 -0
- data/lib/HDLRuby/hdrcc.rb +623 -0
- data/lib/HDLRuby/high_samples/_adder_fault.rb +23 -0
- data/lib/HDLRuby/high_samples/_generic_transmission2.rb +146 -0
- data/lib/HDLRuby/high_samples/adder.rb +21 -0
- data/lib/HDLRuby/high_samples/adder_common_errors.rb +25 -0
- data/lib/HDLRuby/high_samples/addsub.rb +33 -0
- data/lib/HDLRuby/high_samples/addsubz.rb +37 -0
- data/lib/HDLRuby/high_samples/after.rb +28 -0
- data/lib/HDLRuby/high_samples/all_signals.rb +29 -0
- data/lib/HDLRuby/high_samples/alu.rb +61 -0
- data/lib/HDLRuby/high_samples/anonymous.rb +41 -0
- data/lib/HDLRuby/high_samples/before.rb +28 -0
- data/lib/HDLRuby/high_samples/blockblock.rb +26 -0
- data/lib/HDLRuby/high_samples/bugs/dadz.rb +22 -0
- data/lib/HDLRuby/high_samples/bugs/misample_instan.rb +20 -0
- data/lib/HDLRuby/high_samples/bugs/misample_updown.rb +22 -0
- data/lib/HDLRuby/high_samples/bugs/sample_add.rb +16 -0
- data/lib/HDLRuby/high_samples/bugs/sample_barrel.rb +13 -0
- data/lib/HDLRuby/high_samples/bugs/sample_daice.rb +57 -0
- data/lib/HDLRuby/high_samples/bugs/sample_kumiawase.rb +52 -0
- data/lib/HDLRuby/high_samples/bugs/sample_multi.rb +18 -0
- data/lib/HDLRuby/high_samples/bugs/sample_sub.rb +14 -0
- data/lib/HDLRuby/high_samples/bugs/z2.rb +32 -0
- data/lib/HDLRuby/high_samples/case.rb +32 -0
- data/lib/HDLRuby/high_samples/case2.rb +30 -0
- data/lib/HDLRuby/high_samples/change.rb +23 -0
- data/lib/HDLRuby/high_samples/clocks.rb +35 -0
- data/lib/HDLRuby/high_samples/comparer.rb +21 -0
- data/lib/HDLRuby/high_samples/conditionals.rb +29 -0
- data/lib/HDLRuby/high_samples/dff.rb +23 -0
- data/lib/HDLRuby/high_samples/each.rb +28 -0
- data/lib/HDLRuby/high_samples/exporter.rb +42 -0
- data/lib/HDLRuby/high_samples/functions.rb +60 -0
- data/lib/HDLRuby/high_samples/if_seq.rb +26 -0
- data/lib/HDLRuby/high_samples/inherit_as_dff.rb +32 -0
- data/lib/HDLRuby/high_samples/inherit_dff.rb +36 -0
- data/lib/HDLRuby/high_samples/instance.rb +37 -0
- data/lib/HDLRuby/high_samples/memory.rb +64 -0
- data/lib/HDLRuby/high_samples/multi_file.rb +27 -0
- data/lib/HDLRuby/high_samples/overload.rb +32 -0
- data/lib/HDLRuby/high_samples/paper_after.rb +49 -0
- data/lib/HDLRuby/high_samples/ram.rb +27 -0
- data/lib/HDLRuby/high_samples/registers.rb +139 -0
- data/lib/HDLRuby/high_samples/rom.rb +23 -0
- data/lib/HDLRuby/high_samples/scopeblockname.rb +37 -0
- data/lib/HDLRuby/high_samples/scopescope.rb +26 -0
- data/lib/HDLRuby/high_samples/shift.rb +31 -0
- data/lib/HDLRuby/high_samples/shift2.rb +40 -0
- data/lib/HDLRuby/high_samples/simple_instance.rb +31 -0
- data/lib/HDLRuby/high_samples/test_all.sh +10 -0
- data/lib/HDLRuby/high_samples/typedef.rb +24 -0
- data/lib/HDLRuby/high_samples/values.rb +70 -0
- data/lib/HDLRuby/high_samples/vector.rb +22 -0
- data/lib/HDLRuby/high_samples/with_decoder.rb +30 -0
- data/lib/HDLRuby/high_samples/with_fsm.rb +46 -0
- data/lib/HDLRuby/high_samples/with_pipe.rb +43 -0
- data/lib/HDLRuby/high_samples/with_seq.rb +25 -0
- data/lib/HDLRuby/hruby_bstr.rb +1085 -0
- data/lib/HDLRuby/hruby_check.rb +317 -0
- data/lib/HDLRuby/hruby_db.rb +432 -0
- data/lib/HDLRuby/hruby_error.rb +44 -0
- data/lib/HDLRuby/hruby_high.rb +4103 -0
- data/lib/HDLRuby/hruby_low.rb +4735 -0
- data/lib/HDLRuby/hruby_low2c.rb +1986 -0
- data/lib/HDLRuby/hruby_low2high.rb +738 -0
- data/lib/HDLRuby/hruby_low2seq.rb +248 -0
- data/lib/HDLRuby/hruby_low2sym.rb +126 -0
- data/lib/HDLRuby/hruby_low2vhd.rb +1437 -0
- data/lib/HDLRuby/hruby_low_bool2select.rb +295 -0
- data/lib/HDLRuby/hruby_low_cleanup.rb +193 -0
- data/lib/HDLRuby/hruby_low_fix_types.rb +437 -0
- data/lib/HDLRuby/hruby_low_mutable.rb +1803 -0
- data/lib/HDLRuby/hruby_low_resolve.rb +165 -0
- data/lib/HDLRuby/hruby_low_skeleton.rb +129 -0
- data/lib/HDLRuby/hruby_low_with_bool.rb +141 -0
- data/lib/HDLRuby/hruby_low_with_port.rb +167 -0
- data/lib/HDLRuby/hruby_low_with_var.rb +302 -0
- data/lib/HDLRuby/hruby_low_without_bit2vector.rb +88 -0
- data/lib/HDLRuby/hruby_low_without_concat.rb +162 -0
- data/lib/HDLRuby/hruby_low_without_connection.rb +113 -0
- data/lib/HDLRuby/hruby_low_without_namespace.rb +718 -0
- data/lib/HDLRuby/hruby_low_without_outread.rb +107 -0
- data/lib/HDLRuby/hruby_low_without_select.rb +206 -0
- data/lib/HDLRuby/hruby_serializer.rb +398 -0
- data/lib/HDLRuby/hruby_tools.rb +37 -0
- data/lib/HDLRuby/hruby_types.rb +239 -0
- data/lib/HDLRuby/hruby_values.rb +64 -0
- data/lib/HDLRuby/hruby_verilog.rb +1888 -0
- data/lib/HDLRuby/hruby_verilog_name.rb +52 -0
- data/lib/HDLRuby/low_samples/adder.yaml +97 -0
- data/lib/HDLRuby/low_samples/after.yaml +228 -0
- data/lib/HDLRuby/low_samples/before.yaml +223 -0
- data/lib/HDLRuby/low_samples/blockblock.yaml +48 -0
- data/lib/HDLRuby/low_samples/bugs/sample_add.yaml +97 -0
- data/lib/HDLRuby/low_samples/bugs/sample_daice.yaml +444 -0
- data/lib/HDLRuby/low_samples/bugs/sample_kumiawase.yaml +332 -0
- data/lib/HDLRuby/low_samples/bugs/sample_sub.yaml +97 -0
- data/lib/HDLRuby/low_samples/bugs/seqpar.yaml +184 -0
- data/lib/HDLRuby/low_samples/case.yaml +327 -0
- data/lib/HDLRuby/low_samples/change.yaml +135 -0
- data/lib/HDLRuby/low_samples/clocks.yaml +674 -0
- data/lib/HDLRuby/low_samples/cloner.rb +22 -0
- data/lib/HDLRuby/low_samples/comparer.yaml +85 -0
- data/lib/HDLRuby/low_samples/conditionals.yaml +133 -0
- data/lib/HDLRuby/low_samples/dff.yaml +107 -0
- data/lib/HDLRuby/low_samples/each.yaml +1328 -0
- data/lib/HDLRuby/low_samples/exporter.yaml +226 -0
- data/lib/HDLRuby/low_samples/functions.yaml +298 -0
- data/lib/HDLRuby/low_samples/generic_transmission.yaml +597 -0
- data/lib/HDLRuby/low_samples/inherit_as_dff.yaml +125 -0
- data/lib/HDLRuby/low_samples/inherit_dff.yaml +107 -0
- data/lib/HDLRuby/low_samples/load_yaml.rb +11 -0
- data/lib/HDLRuby/low_samples/memory.yaml +678 -0
- data/lib/HDLRuby/low_samples/namespace_extractor.rb +23 -0
- data/lib/HDLRuby/low_samples/overload.yaml +226 -0
- data/lib/HDLRuby/low_samples/paper_after.yaml +431 -0
- data/lib/HDLRuby/low_samples/port_maker.rb +14 -0
- data/lib/HDLRuby/low_samples/ram.yaml +207 -0
- data/lib/HDLRuby/low_samples/registers.yaml +228 -0
- data/lib/HDLRuby/low_samples/rom.yaml +2950 -0
- data/lib/HDLRuby/low_samples/shift.yaml +230 -0
- data/lib/HDLRuby/low_samples/shift2.yaml +2095 -0
- data/lib/HDLRuby/low_samples/simple_instance.yaml +102 -0
- data/lib/HDLRuby/low_samples/test_all.sh +43 -0
- data/lib/HDLRuby/low_samples/typedef.yaml +115 -0
- data/lib/HDLRuby/low_samples/values.yaml +577 -0
- data/lib/HDLRuby/low_samples/variable_maker.rb +14 -0
- data/lib/HDLRuby/low_samples/vector.yaml +56 -0
- data/lib/HDLRuby/low_samples/with_seq.yaml +188 -0
- data/lib/HDLRuby/low_samples/yaml2hdr.rb +10 -0
- data/lib/HDLRuby/low_samples/yaml2vhd.rb +19 -0
- data/lib/HDLRuby/sim/Makefile +19 -0
- data/lib/HDLRuby/sim/hruby_sim.h +590 -0
- data/lib/HDLRuby/sim/hruby_sim_calc.c +2362 -0
- data/lib/HDLRuby/sim/hruby_sim_core.c +589 -0
- data/lib/HDLRuby/sim/hruby_sim_list.c +93 -0
- data/lib/HDLRuby/sim/hruby_sim_vizualize.c +91 -0
- data/lib/HDLRuby/sim/hruby_value_pool.c +64 -0
- data/lib/HDLRuby/std/channel.rb +354 -0
- data/lib/HDLRuby/std/clocks.rb +165 -0
- data/lib/HDLRuby/std/counters.rb +82 -0
- data/lib/HDLRuby/std/decoder.rb +214 -0
- data/lib/HDLRuby/std/fsm.rb +516 -0
- data/lib/HDLRuby/std/pipeline.rb +220 -0
- data/lib/HDLRuby/std/reconf.rb +309 -0
- data/lib/HDLRuby/test_hruby_bstr.rb +2259 -0
- data/lib/HDLRuby/test_hruby_high.rb +594 -0
- data/lib/HDLRuby/test_hruby_high_low.rb +99 -0
- data/lib/HDLRuby/test_hruby_low.rb +934 -0
- data/lib/HDLRuby/v_samples/adder.v +10 -0
- data/lib/HDLRuby/v_samples/dff.v +12 -0
- data/lib/HDLRuby/v_samples/ram.v +20 -0
- data/lib/HDLRuby/v_samples/rom.v +270 -0
- data/lib/HDLRuby/version.rb +3 -0
- data/lib/HDLRuby.rb +11 -0
- data/makedoc +1 -0
- data/metadata.yaml +4 -0
- metadata +299 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
module HDLRuby::High::Std
|
|
2
|
+
|
|
3
|
+
##
|
|
4
|
+
# Standard HDLRuby::High library: counters
|
|
5
|
+
#
|
|
6
|
+
########################################################################
|
|
7
|
+
|
|
8
|
+
## Sets a counter to +init+ when +rst+ is 1 that is decreased according
|
|
9
|
+
# to +clk+.
|
|
10
|
+
# +code+ will be applied on this counter.
|
|
11
|
+
# When not within a block, a behavior will be created which is
|
|
12
|
+
# activated on the rising edge of +clk+.
|
|
13
|
+
def with_counter(init, rst = $rst, clk = $clk, &code)
|
|
14
|
+
# Are we in a block?
|
|
15
|
+
if HDLRuby::High.top_user.is_a?(HDLRuby::High::SystemT) then
|
|
16
|
+
# No, create a behavior.
|
|
17
|
+
behavior(clk.posedge) do
|
|
18
|
+
with_counter(init,rst,clk,&code)
|
|
19
|
+
end
|
|
20
|
+
else
|
|
21
|
+
# Ensure init is a value.
|
|
22
|
+
init = init.to_value
|
|
23
|
+
# Creates the counter
|
|
24
|
+
# counter = HDLRuby::High::SignalI.new(HDLRuby.uniq_name,
|
|
25
|
+
# TypeVector.new(:"",bit,init.width),
|
|
26
|
+
# :inner)
|
|
27
|
+
# Create the name of the counter.
|
|
28
|
+
name = HDLRuby.uniq_name
|
|
29
|
+
# Declare the counter.
|
|
30
|
+
[init.width].inner(name)
|
|
31
|
+
# Get the signal of the counter.
|
|
32
|
+
counter = HDLRuby::High.cur_block.get_inner(name)
|
|
33
|
+
# Apply the code on the counter.
|
|
34
|
+
# code.call(counter)
|
|
35
|
+
instance_exec(counter,&code)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
## Sets a counter to +init+ when +rst+ is 1 that is decreased according
|
|
41
|
+
# to +clk+.
|
|
42
|
+
# As long as this counter does not reach 0, +code+ is executed.
|
|
43
|
+
# When not within a block, a behavior will be created which is
|
|
44
|
+
# activated on the rising edge of +clk+.
|
|
45
|
+
def before(init, rst = $rst, clk = $clk, &code)
|
|
46
|
+
with_counter(init,rst,clk) do |counter|
|
|
47
|
+
seq do
|
|
48
|
+
hif(rst.to_expr == 1) do
|
|
49
|
+
counter.to_ref <= init.to_expr
|
|
50
|
+
end
|
|
51
|
+
helsif(counter.to_expr != 0) do
|
|
52
|
+
counter.to_ref <= counter.to_expr - 1
|
|
53
|
+
# code.call
|
|
54
|
+
instance_eval(&code)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
## Sets a counter to +init+ when +rst+ is 1 that is decreased according
|
|
61
|
+
# to +clk+.
|
|
62
|
+
# When this counter reaches 0, +code+ is executed.
|
|
63
|
+
# When not within a block, a behavior will be created which is activated
|
|
64
|
+
# on the rising edge of +clk+.
|
|
65
|
+
def after(init, rst = $rst, clk = $clk, &code)
|
|
66
|
+
with_counter(init,rst,clk) do |counter|
|
|
67
|
+
seq do
|
|
68
|
+
hif(rst.to_expr == 1) do
|
|
69
|
+
counter.to_ref <= init.to_expr
|
|
70
|
+
end
|
|
71
|
+
helsif(counter.to_expr == 0) do
|
|
72
|
+
# code.call
|
|
73
|
+
instance_eval(&code)
|
|
74
|
+
end
|
|
75
|
+
helse do
|
|
76
|
+
counter.to_ref <= counter.to_expr - 1
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
end
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
module HDLRuby::High::Std
|
|
2
|
+
|
|
3
|
+
##
|
|
4
|
+
# Standard HDLRuby::High library: decoder generator.
|
|
5
|
+
#
|
|
6
|
+
########################################################################
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
##
|
|
10
|
+
# Describes a high-level decoder type.
|
|
11
|
+
class DecoderT
|
|
12
|
+
include HDLRuby::High::HScope_missing
|
|
13
|
+
|
|
14
|
+
# The description of a decoding field.
|
|
15
|
+
class Field
|
|
16
|
+
attr_accessor :range, :content
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# The entry class
|
|
20
|
+
class Entry
|
|
21
|
+
attr_accessor :id_fields, # The fields for identifying the entry
|
|
22
|
+
:var_fields,# The fields for getting variables
|
|
23
|
+
:code # The code to execute when the entry matches
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# The name of the decoder type.
|
|
27
|
+
attr_reader :name
|
|
28
|
+
|
|
29
|
+
# The namespace associated with the decoder
|
|
30
|
+
attr_reader :namespace
|
|
31
|
+
|
|
32
|
+
# The default code if any.
|
|
33
|
+
attr_reader :default_code
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
# Creates a new decoder type with +name+.
|
|
37
|
+
def initialize(name)
|
|
38
|
+
# Check and set the name
|
|
39
|
+
@name = name.to_sym
|
|
40
|
+
|
|
41
|
+
# Initialize the internals of the decoder.
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# Initialize the environment for building the decoder.
|
|
45
|
+
|
|
46
|
+
# The main entries.
|
|
47
|
+
@entries = []
|
|
48
|
+
|
|
49
|
+
# The default code to execute when no entry match.
|
|
50
|
+
@default_code = nil
|
|
51
|
+
|
|
52
|
+
# Creates the namespace to execute the fsm block in.
|
|
53
|
+
@namespace = Namespace.new(self)
|
|
54
|
+
|
|
55
|
+
# Generates the function for setting up the decoder
|
|
56
|
+
# provided there is a name.
|
|
57
|
+
obj = self # For using the right self within the proc
|
|
58
|
+
HDLRuby::High.space_reg(@name) do |expr,&ruby_block|
|
|
59
|
+
if ruby_block then
|
|
60
|
+
# Builds the decoder.
|
|
61
|
+
obj.build(expr,&ruby_block)
|
|
62
|
+
else
|
|
63
|
+
# Return the fsm as is.
|
|
64
|
+
return obj
|
|
65
|
+
end
|
|
66
|
+
end unless name.empty?
|
|
67
|
+
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
## builds the decoder on expression +expr+ by executing +ruby_block+.
|
|
71
|
+
def build(expr,&ruby_block)
|
|
72
|
+
# Use local variable for accessing the attribute since they will
|
|
73
|
+
# be hidden when opening the sytem.
|
|
74
|
+
entries = @entries
|
|
75
|
+
namespace = @namespace
|
|
76
|
+
this = self
|
|
77
|
+
return_value = nil
|
|
78
|
+
|
|
79
|
+
HDLRuby::High.space_push(namespace)
|
|
80
|
+
# Execute the instantiation block
|
|
81
|
+
return_value =HDLRuby::High.top_user.instance_exec(&ruby_block)
|
|
82
|
+
|
|
83
|
+
# Create the decoder code
|
|
84
|
+
|
|
85
|
+
# The process
|
|
86
|
+
par do
|
|
87
|
+
# Depending on the type of entry.
|
|
88
|
+
test = :hif # Which command to use for testing
|
|
89
|
+
# (first: hif, then heslif)
|
|
90
|
+
entries.each do |entry|
|
|
91
|
+
# Build the predicate for checking the entry.
|
|
92
|
+
entry_predicate = entry.id_fields.map do |field|
|
|
93
|
+
expr[field.range] == field.content
|
|
94
|
+
end.reduce(:&)
|
|
95
|
+
|
|
96
|
+
send(test,entry_predicate) do
|
|
97
|
+
# Sets the local variables.
|
|
98
|
+
entry.var_fields.each do |field|
|
|
99
|
+
this.
|
|
100
|
+
define_singleton_method(field.content) do
|
|
101
|
+
expr[field.range]
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
# Generate the content of the entry.
|
|
105
|
+
entry.code.call
|
|
106
|
+
end
|
|
107
|
+
test = :helsif # Now use helsif for the alternative.
|
|
108
|
+
end
|
|
109
|
+
# Adds the default code if any.
|
|
110
|
+
if default_code then
|
|
111
|
+
helse(&default_code)
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
HDLRuby::High.space_pop
|
|
116
|
+
|
|
117
|
+
return return_value
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
## The interface for building the decoder
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
# Declares a new entry with +format+ and executing +ruby_block+.
|
|
125
|
+
def entry(format, &ruby_block)
|
|
126
|
+
# puts "entry with format=#{format}"
|
|
127
|
+
# Create the resulting entry
|
|
128
|
+
result = Entry.new
|
|
129
|
+
result.code = ruby_block
|
|
130
|
+
# Process the format.
|
|
131
|
+
format = format.to_s
|
|
132
|
+
width = format.size
|
|
133
|
+
# For that purpose create the regular expression used to process it.
|
|
134
|
+
prs = "([0-1]+)|(a+)|(b+)|(c+)|(d+)|(e+)|(g+)|(h+)|(i+)|(j+)|(k+)|(l+)|(m+)|(n+)|(o+)|(p+)|(q+)|(r+)|(s+)|(t+)|(u+)|(v+)|(w+)|(x+)|(y+)|(z+)"
|
|
135
|
+
# Check if the format is compatible with it.
|
|
136
|
+
unless format =~ Regexp.new("^(#{prs})+$") then
|
|
137
|
+
raise AnyError("Invalid format for a field: #{format}")
|
|
138
|
+
end
|
|
139
|
+
# Split the format in fields.
|
|
140
|
+
format = format.split(Regexp.new(prs)).select {|str| !str.empty?}
|
|
141
|
+
# puts "format=#{format}"
|
|
142
|
+
# Fills the entry with each field of the format.
|
|
143
|
+
result.id_fields = []
|
|
144
|
+
result.var_fields = []
|
|
145
|
+
pos = width-1
|
|
146
|
+
format.each do |str|
|
|
147
|
+
# puts "str=#{str}"
|
|
148
|
+
# Create a new field and compute its range.
|
|
149
|
+
field = Field.new
|
|
150
|
+
field.range = pos..(pos-str.size+1)
|
|
151
|
+
# Build its content, and add the field.
|
|
152
|
+
# Depends on wether it is an id or a variable field?
|
|
153
|
+
if str =~ /[0-1]+/ then
|
|
154
|
+
# Id field.
|
|
155
|
+
# Build its type.
|
|
156
|
+
type = TypeVector.new(:"",bit,
|
|
157
|
+
field.range.first-field.range.last..0)
|
|
158
|
+
# Build the content as a value.
|
|
159
|
+
field.content = Value.new(type,str)
|
|
160
|
+
# Add the field.
|
|
161
|
+
result.id_fields << field
|
|
162
|
+
else
|
|
163
|
+
# Variable field.
|
|
164
|
+
# Build the content as a single-character symbol.
|
|
165
|
+
field.content = str[0].to_sym
|
|
166
|
+
# Add the field.
|
|
167
|
+
result.var_fields << field
|
|
168
|
+
end
|
|
169
|
+
# Update the position.
|
|
170
|
+
pos = pos-str.size
|
|
171
|
+
end
|
|
172
|
+
# Add it to the list of entries.
|
|
173
|
+
@entries << result
|
|
174
|
+
# Return it.
|
|
175
|
+
return result
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
# Declares the default code to execute when no format maches.
|
|
179
|
+
def default(&ruby_block)
|
|
180
|
+
@default_code = ruby_block
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
## Declare a new decoder.
|
|
188
|
+
# The arguments can be any of (but in this order):
|
|
189
|
+
#
|
|
190
|
+
# - +name+:: name.
|
|
191
|
+
# - +expr+:: the expression to decode.
|
|
192
|
+
#
|
|
193
|
+
# If provided, +ruby_block+ the fsm is directly instantiated with it.
|
|
194
|
+
def decoder(*args, &ruby_block)
|
|
195
|
+
# Sets the name if any
|
|
196
|
+
unless args[0].respond_to?(:to_expr) then
|
|
197
|
+
name = args.shift.to_sym
|
|
198
|
+
else
|
|
199
|
+
name = :""
|
|
200
|
+
end
|
|
201
|
+
# Create the decoder.
|
|
202
|
+
decoderI = DecoderT.new(name)
|
|
203
|
+
|
|
204
|
+
# Is there a ruby block?
|
|
205
|
+
if ruby_block then
|
|
206
|
+
# Yes, generate the decoder.
|
|
207
|
+
decoderI.build(*args,&ruby_block)
|
|
208
|
+
else
|
|
209
|
+
# No return the decoder structure for later generation.
|
|
210
|
+
return decoderI
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
end
|