HDLRuby 2.11.11 → 2.11.12

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.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +55 -18
  3. data/ext/hruby_sim/hruby_rcsim_build.c +27 -0
  4. data/ext/hruby_sim/hruby_sim.h +3 -0
  5. data/ext/hruby_sim/hruby_sim_core.c +17 -5
  6. data/ext/hruby_sim/hruby_sim_stack_calc.c +1 -1
  7. data/ext/hruby_sim/hruby_sim_tree_calc.c +8 -1
  8. data/ext/hruby_sim/hruby_sim_vcd.c +24 -7
  9. data/ext/hruby_sim/hruby_sim_vizualize.c +9 -1
  10. data/lib/HDLRuby/hdr_samples/constant_in_function.rb +3 -1
  11. data/lib/HDLRuby/hdr_samples/counter_dff_bench.rb +3 -1
  12. data/lib/HDLRuby/hdr_samples/huge_rom.rb +1 -1
  13. data/lib/HDLRuby/hdr_samples/mei8.rb +11 -11
  14. data/lib/HDLRuby/hdr_samples/mei8_bench.rb +11 -11
  15. data/lib/HDLRuby/hdr_samples/neg_arith_bench.rb +4 -4
  16. data/lib/HDLRuby/hdr_samples/rom_nest.rb +1 -1
  17. data/lib/HDLRuby/hdr_samples/ruby_fir_hw.rb +4 -4
  18. data/lib/HDLRuby/hdr_samples/struct.rb +44 -10
  19. data/lib/HDLRuby/hdr_samples/with_bram.rb +45 -0
  20. data/lib/HDLRuby/hdr_samples/with_casts.rb +3 -3
  21. data/lib/HDLRuby/hdr_samples/with_concat.rb +6 -6
  22. data/lib/HDLRuby/hdr_samples/with_connector_memory.rb +2 -2
  23. data/lib/HDLRuby/hdr_samples/with_def.rb +10 -3
  24. data/lib/HDLRuby/hdr_samples/with_define_operator.rb +44 -0
  25. data/lib/HDLRuby/hdr_samples/with_fixpoint.rb +12 -12
  26. data/lib/HDLRuby/hdr_samples/with_init.rb +3 -3
  27. data/lib/HDLRuby/hdr_samples/with_leftright.rb +21 -0
  28. data/lib/HDLRuby/hdr_samples/with_reduce.rb +13 -13
  29. data/lib/HDLRuby/hdr_samples/with_ref_array.rb +6 -6
  30. data/lib/HDLRuby/hdr_samples/with_subsums.rb +3 -3
  31. data/lib/HDLRuby/hdr_samples/with_terminate.rb +3 -3
  32. data/lib/HDLRuby/hdr_samples/with_to_a.rb +10 -10
  33. data/lib/HDLRuby/hdr_samples/with_values.rb +3 -3
  34. data/lib/HDLRuby/hdrcc.rb +14 -1
  35. data/lib/HDLRuby/hruby_bstr.rb +10 -5
  36. data/lib/HDLRuby/hruby_high.rb +114 -27
  37. data/lib/HDLRuby/hruby_low.rb +187 -16
  38. data/lib/HDLRuby/hruby_low2c.rb +71 -11
  39. data/lib/HDLRuby/hruby_low2vhd.rb +2 -1
  40. data/lib/HDLRuby/hruby_low_fix_types.rb +1 -0
  41. data/lib/HDLRuby/hruby_low_mutable.rb +30 -1
  42. data/lib/HDLRuby/hruby_low_resolve.rb +15 -2
  43. data/lib/HDLRuby/hruby_low_without_concat.rb +28 -8
  44. data/lib/HDLRuby/hruby_low_without_parinseq.rb +14 -4
  45. data/lib/HDLRuby/hruby_low_without_select.rb +2 -2
  46. data/lib/HDLRuby/hruby_low_without_subsignals.rb +279 -0
  47. data/lib/HDLRuby/hruby_rcsim.rb +80 -71
  48. data/lib/HDLRuby/hruby_rsim.rb +132 -7
  49. data/lib/HDLRuby/hruby_rsim_vcd.rb +99 -27
  50. data/lib/HDLRuby/hruby_values.rb +35 -31
  51. data/lib/HDLRuby/std/bram.rb +22 -0
  52. data/lib/HDLRuby/std/fixpoint.rb +2 -2
  53. data/lib/HDLRuby/std/fsm.rb +20 -3
  54. data/lib/HDLRuby/std/function_generator.rb +2 -2
  55. data/lib/HDLRuby/version.rb +1 -1
  56. metadata +7 -3
  57. data/lib/HDLRuby/hdr_samples/sumprod.rb +0 -29
@@ -1,14 +1,48 @@
1
- system :dff do
2
- input :clk, :rst, :d
3
- output :q
4
-
5
- par(clk.posedge) { q <= d & ~rst }
1
+ typedef(:some_struct) do
2
+ { sub2: bit, sub3: bit[2] }
6
3
  end
7
4
 
8
5
  system :my_system do
9
- input :clk, :rst
10
- { sub0: bit, sub1: bit}.inner :sig
11
-
12
- dff(:dff0).(clk: clk, rst: rst)
13
- dff0.d <= sig.sub0
6
+ inner :x
7
+ [3].inner :y
8
+ inner :z
9
+ { sub0: bit, sub1: bit[2]}.inner :sigA
10
+ some_struct.inner :sigB, :sigC
11
+
12
+ sigC <= sigA
13
+
14
+ par(sigA) { z <= ~z }
15
+
16
+
17
+ timed do
18
+ z <= 0
19
+ x <= 1
20
+ y <= _b000
21
+ !10.ns
22
+ sigA.sub0 <= 0
23
+ sigA.sub1 <= x
24
+ sigB.sub2 <= 0
25
+ sigB.sub3 <= x
26
+ !10.ns
27
+ sigA.sub0 <= x
28
+ sigA.sub1 <= ~sigB.sub3
29
+ sigB.sub2 <= x
30
+ sigB.sub3 <= ~sigA.sub1
31
+ !10.ns
32
+ sigA <= _b111
33
+ sigB <= _b111
34
+ !10.ns
35
+ sigA <= _b100
36
+ !10.ns
37
+ y <= sigA
38
+ sigB <= sigA
39
+ !10.ns
40
+ sigA <= _b011
41
+ !10.ns
42
+ sigB <= sigA
43
+ !10.ns
44
+ sigB <= sigA + 1
45
+ !10.ns
46
+ end
47
+
14
48
  end
@@ -0,0 +1,45 @@
1
+ require 'std/bram.rb'
2
+
3
+ include HDLRuby::High::Std
4
+
5
+
6
+ # A system testing the memory.
7
+ system :bram_test do
8
+
9
+ widthA = 16
10
+ widthD = 8
11
+
12
+
13
+ input :clk,:rwb
14
+ [widthA].inner :addr
15
+ [widthD].inner :din,:dout
16
+
17
+ bram(widthA,widthD).(:bramI).(clk,rwb,addr,din,dout)
18
+
19
+ timed do
20
+ clk <= 0
21
+ rwb <= 1
22
+ addr <= 0
23
+ din <= 0
24
+ !10.ns
25
+ clk <= 1
26
+ !10.ns
27
+ rwb <= 1
28
+ repeat(16) do
29
+ clk <= 0
30
+ !10.ns
31
+ clk <= 1
32
+ addr <= addr + 1
33
+ din <= din + 1
34
+ !10.ns
35
+ end
36
+ rwb <= 0
37
+ repeat(16) do
38
+ clk <= 0
39
+ !10.ns
40
+ clk <= 1
41
+ addr <= addr-1
42
+ !10.ns
43
+ end
44
+ end
45
+ end
@@ -6,9 +6,9 @@ system :with_cast do
6
6
  [9].inner :val2,:val3
7
7
 
8
8
  timed do
9
- val0 <= _11111111
10
- val1 <= _00000010
11
- val3 <= _000000000
9
+ val0 <= _b11111111
10
+ val1 <= _b00000010
11
+ val3 <= _b000000000
12
12
  count <= 0
13
13
  !10.ns
14
14
  count <= 1
@@ -10,16 +10,16 @@ system :with_concat do
10
10
  val3 <= [val2,val0]
11
11
 
12
12
  timed do
13
- val0 <= _1111
14
- val1 <= _0000
13
+ val0 <= _b1111
14
+ val1 <= _b0000
15
15
  count <= 0
16
16
  !10.ns
17
- val0 <= _1001
18
- val1 <= _0110
17
+ val0 <= _b1001
18
+ val1 <= _b0110
19
19
  count <= 1
20
20
  !10.ns
21
- val0 <= _1010
22
- val1 <= _0101
21
+ val0 <= _b1010
22
+ val1 <= _b0101
23
23
  count <= 2
24
24
  !10.ns
25
25
  end
@@ -12,8 +12,8 @@ system :channel_connector do
12
12
  address_width = 4 # lutのアドレスのビット幅
13
13
  typ = signed[integer_width + decimal_width] # データ型
14
14
 
15
- inputs_x = _00010011
16
- inputs_h = _10100001
15
+ inputs_x = _b00010011
16
+ inputs_h = _b10100001
17
17
  columns = [2, 2, 1]
18
18
 
19
19
  inner :clk, # clock
@@ -9,11 +9,18 @@ end
9
9
  system :def_bench do
10
10
 
11
11
  [2].inner :addr
12
- [8].inner :val0, :val1
12
+ [8].inner :val0, :val1, :val2, :val3
13
13
 
14
14
  par do
15
- val0 <= lut84([0,1,4,9],addr)
16
- val1 <= lut84([0,1,4,9],3-addr)
15
+ val0 <= lut84([_b8d0,_b8d1,_b8d4,_b8d9],addr)
16
+ val1 <= lut84([_b8d0,_b8d1,_b8d4,_b8d9],3-addr)
17
+ end
18
+
19
+ bit[8][-4].inner otbl: [_b8d0,_b8d1,_b8d4,_b8d9]
20
+
21
+ par do
22
+ val2 <= otbl[addr]
23
+ val3 <= otbl[3-addr]
17
24
  end
18
25
 
19
26
  timed do
@@ -0,0 +1,44 @@
1
+ # A sample for testing define operator.
2
+
3
+ typedef :sat100 do |width|
4
+ signed[width]
5
+ end
6
+
7
+ sat100.define_operator(:+) do |width, x,y|
8
+ tmp = x.as(bit[width]) + y.as(bit[width])
9
+ mux(tmp > 100,tmp,100)
10
+ end
11
+
12
+ typedef :sat do |width, max|
13
+ signed[width]
14
+ end
15
+
16
+ sat.define_operator(:+) do |width,max, x,y|
17
+ tmp = x.as(bit[width]) + y.as(bit[width])
18
+ mux(tmp > max, tmp, max)
19
+ end
20
+
21
+
22
+ system :bench_sat do
23
+ sat100(8).inner :x,:y,:z
24
+ sat(8,55).inner :u,:v,:w
25
+
26
+ timed do
27
+ x <= 40
28
+ y <= 32
29
+ z <= x+y
30
+ !10.ns
31
+ u <= 20
32
+ v <= 24
33
+ w <= u+v
34
+ !10.ns
35
+ x <= 70
36
+ y <= 32
37
+ z <= x+y
38
+ !10.ns
39
+ u <= 50
40
+ v <= 24
41
+ w <= u+v
42
+ !10.ns
43
+ end
44
+ end
@@ -14,9 +14,9 @@ system :fix_test do
14
14
 
15
15
  # Performs calculation between then
16
16
  timed do
17
- # x <= _00110011 # 3.1875
17
+ # x <= _b00110011 # 3.1875
18
18
  x <= 3.1875.to_fix(4)
19
- y <= _01000000 # 4
19
+ y <= _b01000000 # 4
20
20
  !10.ns
21
21
  z <= x + y
22
22
  !10.ns
@@ -24,8 +24,8 @@ system :fix_test do
24
24
  !10.ns
25
25
  z <= z / x
26
26
  !10.ns
27
- a <= _00010000
28
- b <= _00001111
27
+ a <= _b00010000
28
+ b <= _b00001111
29
29
  !10.ns
30
30
  c <= a * b
31
31
  d <= 0
@@ -49,15 +49,15 @@ system :fix_test do
49
49
  !10.ns
50
50
  c <= a * b
51
51
  !10.ns
52
- # a <= _00010000
53
- # b <= _00010101
54
- a <= _0000111x
55
- b <= _1110011x
52
+ # a <= _b00010000
53
+ # b <= _b00010101
54
+ a <= _sb0000111x
55
+ b <= _sb1110011x
56
56
  !10.ns
57
- # a <= a & _11111110
58
- # b <= b | _00000001
59
- a <= a | _00000001
60
- b <= b | _00000001
57
+ # a <= a & _b11111110
58
+ # b <= b | _b00000001
59
+ a <= a | _b00000001
60
+ b <= b | _b00000001
61
61
  !10.ns
62
62
  c <= a * b
63
63
  !10.ns
@@ -2,9 +2,9 @@
2
2
  # A benchmark for testing the initialization of signals.
3
3
  system :with_init do
4
4
  [8].constant cst0: 127
5
- constant cst1: _1
6
- [8].inner sig0: _10000000
7
- inner sig1: _1
5
+ constant cst1: _b1
6
+ [8].inner sig0: _b10000000
7
+ inner sig1: _b1
8
8
  [8].inner :sig2
9
9
 
10
10
  timed do
@@ -0,0 +1,21 @@
1
+ # A benchmark for the cases where a left value is also a right value
2
+ # in a block without sensitivity list.
3
+ system :leftright_bench do
4
+ [8].inner :l,:r0,:r1,:lr
5
+
6
+ par do
7
+ lr <= r0*2
8
+ l <= [lr[7],lr[6..0]].to_expr + r1
9
+ end
10
+
11
+ timed do
12
+ !10.ns
13
+ r0 <= 1
14
+ !10.ns
15
+ r1 <= 2
16
+ !10.ns
17
+ r0 <= 3
18
+ r1 <= 4
19
+ !10.ns
20
+ end
21
+ end
@@ -6,33 +6,33 @@ system :with_reduce_bench do
6
6
  [64].inner :val64
7
7
 
8
8
  timed do
9
- val <= _01101010
10
- res <= val.reduce(_00000000,:+)
9
+ val <= _b01101010
10
+ res <= val.reduce(_b00000000,:+)
11
11
  !10.ns
12
12
  val <= _01010010
13
- res <= val.reduce(_00000000,:+)
13
+ res <= val.reduce(_b00000000,:+)
14
14
  !10.ns
15
15
  val <= _01101111
16
- res <= val.reduce(_00000000,:+)
16
+ res <= val.reduce(_b00000000,:+)
17
17
  !10.ns
18
- val64 <= _0110101001101010011010100110101001101010011010100110101001101010
19
- res <= val64.reduce(_00000000,:+)
18
+ val64 <= _b0110101001101010011010100110101001101010011010100110101001101010
19
+ res <= val64.reduce(_b00000000,:+)
20
20
  !10.ns
21
21
  res <= val64[7..0]
22
22
  !10.ns
23
- res <= res.reduce(_00000000,:+)
23
+ res <= res.reduce(_b00000000,:+)
24
24
  !10.ns
25
25
  res <= val64[63..60]
26
26
  !10.ns
27
- res <= res.reduce(_00000000,:+)
27
+ res <= res.reduce(_b00000000,:+)
28
28
  !10.ns
29
29
  val64 <= ~(val64 ^ val64)
30
- res <= val64.reduce(_00000000,:+)
30
+ res <= val64.reduce(_b00000000,:+)
31
31
  !10.ns
32
- val64[0] <= _0
33
- val64[3] <= _0
34
- val64[63] <= _0
35
- res <= val64.reduce(_00000000,:+)
32
+ val64[0] <= _b0
33
+ val64[3] <= _b0
34
+ val64[63] <= _b0
35
+ res <= val64.reduce(_b00000000,:+)
36
36
  !10.ns
37
37
  end
38
38
  end
@@ -10,16 +10,16 @@ system :with_concat do
10
10
  val3[6..3] <= val1[7..4]
11
11
 
12
12
  timed do
13
- val0 <= _00001111
14
- val1 <= _11000011
13
+ val0 <= _b00001111
14
+ val1 <= _b11000011
15
15
  count <= 0
16
16
  !10.ns
17
- val0 <= _11110000
18
- val1 <= _00111100
17
+ val0 <= _b11110000
18
+ val1 <= _b00111100
19
19
  count <= 1
20
20
  !10.ns
21
- val0 <= _10101010
22
- val1 <= _01010101
21
+ val0 <= _b10101010
22
+ val1 <= _b01010101
23
23
  count <= 2
24
24
  !10.ns
25
25
  end
@@ -20,13 +20,13 @@ system :with_concat do
20
20
  val6 <= bs.reduce(:+)
21
21
 
22
22
  timed do
23
- val0 <= _1111000011110000
23
+ val0 <= _b1111000011110000
24
24
  count <= 0
25
25
  !10.ns
26
- val0 <= _0000111100001111
26
+ val0 <= _b0000111100001111
27
27
  count <= 1
28
28
  !10.ns
29
- val0 <= _1010101010101010
29
+ val0 <= _b1010101010101010
30
30
  count <= 2
31
31
  !10.ns
32
32
  end
@@ -2,9 +2,9 @@
2
2
  # A benchmark for testing the terminate statement.
3
3
  system :with_terminate do
4
4
  [8].constant cst0: 127
5
- constant cst1: _1
6
- [8].inner sig0: _10000000
7
- inner sig1: _1
5
+ constant cst1: _b1
6
+ [8].inner sig0: _b10000000
7
+ inner sig1: _b1
8
8
  [8].inner :sig2
9
9
  [8].inner count: 0
10
10
 
@@ -52,26 +52,26 @@ system :with_to_a_bench do
52
52
  four2sixfour(:my_four2sixfour).(four,*(sixfour.to_a.reverse))
53
53
 
54
54
  timed do
55
- val <= _01101010
55
+ val <= _b01101010
56
56
  res <= vals.reverse
57
57
  !10.ns
58
- val64 <= _0110101001101010011010100110101001101010011010100110101001101010
58
+ val64 <= _b0110101001101010011010100110101001101010011010100110101001101010
59
59
  res64 <= val64s.reverse
60
60
  !10.ns
61
- val <= _00000000
62
- val64 <= _0000000000000000000000000000000000000000000000000000000000000000
61
+ val <= _b00000000
62
+ val64 <= _b0000000000000000000000000000000000000000000000000000000000000000
63
63
  !10.ns
64
64
  vals.each.with_index do |v,i|
65
- v <= (i/2) & _1
65
+ v <= (i/2) & _b1
66
66
  end
67
67
  res <= val
68
68
  !10.ns
69
69
  val64s.each.with_index do |v,i|
70
- v <= (i/2) & _1
70
+ v <= (i/2) & _b1
71
71
  end
72
72
  res64 <= val64
73
73
  !10.ns
74
- val <= _01010011
74
+ val <= _b01010011
75
75
  !10.ns
76
76
  8.times do |i|
77
77
  val64s[i] <= val[i]
@@ -80,11 +80,11 @@ system :with_to_a_bench do
80
80
  end
81
81
  res64 <= val64
82
82
  !10.ns
83
- four <= _0000
83
+ four <= _b0000
84
84
  !10.ns
85
- four <= _0001
85
+ four <= _b0001
86
86
  !10.ns
87
- four <= _1100
87
+ four <= _b1100
88
88
  !10.ns
89
89
  end
90
90
  end
@@ -11,7 +11,7 @@ system :with_values do
11
11
 
12
12
 
13
13
  timed do
14
- v1 <= 0
14
+ v1 <= _b0
15
15
  v8 <= 0
16
16
  v16 <= 0
17
17
  v32 <= 0
@@ -19,7 +19,7 @@ system :with_values do
19
19
  v64 <= 0
20
20
  v96 <= 0
21
21
  !10.ns
22
- v1 <= 1
22
+ v1 <= _b1
23
23
  v8 <= 1
24
24
  v16 <= 1
25
25
  v32 <= 1
@@ -27,7 +27,7 @@ system :with_values do
27
27
  v64 <= 1
28
28
  v96 <= 1
29
29
  !10.ns
30
- v1 <= _1010[2]
30
+ v1 <= _b1010[2]
31
31
  v8 <= _uhFF00[12..4]
32
32
  !10.ns
33
33
  v8 <= 128
data/lib/HDLRuby/hdrcc.rb CHANGED
@@ -60,6 +60,7 @@ require 'HDLRuby/hruby_check.rb'
60
60
  require 'HDLRuby/hruby_low2hdr'
61
61
  require 'HDLRuby/hruby_low2c'
62
62
  require 'HDLRuby/hruby_low2vhd'
63
+ require 'HDLRuby/hruby_low_without_subsignals'
63
64
  require 'HDLRuby/hruby_low_fix_types'
64
65
  # require 'HDLRuby/hruby_low_expand_types' # For now dormant
65
66
  require 'HDLRuby/hruby_low_without_outread'
@@ -641,8 +642,12 @@ elsif $options[:clang] then
641
642
  # top_system = $top_system
642
643
  # Preprocess the HW description for valid C generation.
643
644
  $top_system.each_systemT_deep do |systemT|
645
+ HDLRuby.show? "signal2subs step..."
646
+ # Ensure there is not implicit assign to sub signals.
647
+ systemT.signal2subs!
648
+ HDLRuby.show? "#{Time.now}#{show_mem}"
644
649
  HDLRuby.show? "seq2seq step..."
645
- # Coverts the par blocks in seq blocks to seq blocks to match
650
+ # Converts the par blocks in seq blocks to seq blocks to match
646
651
  # the simulation engine.
647
652
  systemT.par_in_seq2seq!
648
653
  HDLRuby.show? "#{Time.now}#{show_mem}"
@@ -801,6 +806,9 @@ elsif $options[:verilog] then
801
806
  # top_system = $top_system
802
807
  # Make description compatible with verilog generation.
803
808
  $top_system.each_systemT_deep do |systemT|
809
+ HDLRuby.show? "signal2subs step..."
810
+ # Ensure there is not implicit assign to sub signals.
811
+ systemT.signal2subs!
804
812
  # HDLRuby.show "casts_without_expression! step..."
805
813
  # systemT.casts_without_expression!
806
814
  # HDLRuby.show Time.now
@@ -889,6 +897,8 @@ elsif $options[:rcsim] then
889
897
  require 'HDLRuby/hruby_rcsim.rb'
890
898
  # Merge the included from the top system.
891
899
  $top_system.merge_included!
900
+ # Process par in seq.
901
+ $top_system.par_in_seq2seq!
892
902
  # Generate the C data structures.
893
903
  $top_system.to_rcsim
894
904
  HDLRuby.show "Executing the hybrid C-Ruby-level simulator..."
@@ -902,6 +912,9 @@ elsif $options[:vhdl] then
902
912
  # top_system = $top_system
903
913
  # Make description compatible with vhdl generation.
904
914
  $top_system.each_systemT_deep do |systemT|
915
+ HDLRuby.show? "signal2subs step..."
916
+ # Ensure there is not implicit assign to sub signals.
917
+ systemT.signal2subs!
905
918
  systemT.outread2inner! unless $options[:vhdl08] || $options[:alliance]
906
919
  systemT.with_boolean!
907
920
  systemT.boolean_in_assign2select! unless $options[:alliance]
@@ -225,6 +225,7 @@ module HDLRuby
225
225
  # * when index is larger than the bit width, the bit string is
226
226
  # X extended accordingly.
227
227
  def []=(index,value)
228
+ # puts "first @content=#{@content}"
228
229
  # Change inside the bit string, it is not know any longer if it
229
230
  # is specified or not
230
231
  @specified = nil
@@ -250,8 +251,8 @@ module HDLRuby
250
251
  sign = @content[-1]
251
252
  @content.concat([sign] * (right-@content.size+1))
252
253
  end
254
+ # puts "left=#{left} right=#{right} sign=#{sign} @content=#{@content}"
253
255
  if right >= left then
254
- # puts "left=#{left} right=#{right} value=#{value} (#{value.class})"
255
256
  # Sets the value to a copy of the bit string.
256
257
  @content[left..right] = value.is_a?(BitString) ?
257
258
  value.raw_content[0..right-left] :
@@ -412,10 +413,14 @@ module HDLRuby
412
413
  return @specified
413
414
  end
414
415
 
415
- # # Coerces.
416
- # def coerce(other)
417
- # return [BitString.new(other),self]
418
- # end
416
+ # Coerces.
417
+ def coerce(other)
418
+ if other.is_a?(Numeric) && self.specified? then
419
+ return [other,self.to_i]
420
+ else
421
+ return [BitString.new(other),self]
422
+ end
423
+ end
419
424
 
420
425
  # String conversion table.
421
426
  B2S_T = [ "0", "1", "z", "x" ]