HDLRuby 2.11.11 → 2.11.12

Sign up to get free protection for your applications and to get access to all the features.
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" ]