HDLRuby 2.11.4 → 2.11.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,92 @@
1
+
2
+ # A benchmark for the arithmetic operations.
3
+ system :arith_bench do
4
+ signed[8].inner :x8,:y8,:z8,:s8
5
+ signed[10].inner :s10
6
+ signed[16].inner :x16,:y16,:z16,:s16
7
+ signed[18].inner :s18
8
+ signed[32].inner :x32,:y32,:z32,:s32
9
+ signed[34].inner :s34
10
+
11
+ s8 <= x8+y8+z8
12
+ s10 <= x8.as(signed[10])+y8+z8
13
+
14
+ s16 <= x16+y16+z16
15
+ s18 <= x16.as(signed[18])+y16+z16
16
+
17
+ s32 <= x32+y32+z32
18
+ s34 <= x32.as(signed[34])+y32+z32
19
+
20
+ timed do
21
+ x8 <= 0
22
+ y8 <= 0
23
+ z8 <= 0
24
+ x16 <= 0
25
+ y16 <= 0
26
+ z16 <= 0
27
+ x32 <= 0
28
+ y32 <= 0
29
+ z32 <= 0
30
+ !10.ns
31
+ x8 <= 1
32
+ y8 <= 1
33
+ z8 <= 1
34
+ x16 <= 1
35
+ y16 <= 1
36
+ z16 <= 1
37
+ x32 <= 1
38
+ y32 <= 1
39
+ z32 <= 1
40
+ !10.ns
41
+ x8 <= 2
42
+ y8 <= 2
43
+ z8 <= 2
44
+ x16 <= 4
45
+ y16 <= 4
46
+ z16 <= 4
47
+ x32 <= 8
48
+ y32 <= 8
49
+ z32 <= 8
50
+ !10.ns
51
+ x8 <= 0x7F
52
+ y8 <= 0x7F
53
+ z8 <= 0x7F
54
+ x16 <= 0x7FFF
55
+ y16 <= 0x7FFF
56
+ z16 <= 0x7FFF
57
+ x32 <= 0x7FFFFFFF
58
+ y32 <= 0x7FFFFFFF
59
+ z32 <= 0x7FFFFFFF
60
+ !10.ns
61
+ x8 <= -1
62
+ y8 <= -1
63
+ z8 <= -1
64
+ x16 <= -1
65
+ y16 <= -1
66
+ z16 <= -1
67
+ x32 <= -1
68
+ y32 <= -1
69
+ z32 <= -1
70
+ !10.ns
71
+ x8 <= -2
72
+ y8 <= -2
73
+ z8 <= -2
74
+ x16 <= -4
75
+ y16 <= -4
76
+ z16 <= -4
77
+ x32 <= -8
78
+ y32 <= -8
79
+ z32 <= -8
80
+ !10.ns
81
+ x8 <= -0x80
82
+ y8 <= -0x80
83
+ z8 <= -0x80
84
+ x16 <= -0x8000
85
+ y16 <= -0x8000
86
+ z16 <= -0x8000
87
+ x32 <= -0x80000000
88
+ y32 <= -0x80000000
89
+ z32 <= -0x80000000
90
+ !10.ns
91
+ end
92
+ end
@@ -0,0 +1,58 @@
1
+ # A simple counter
2
+ system :counter do
3
+ input :clk, :rst
4
+ [8].input :inc
5
+ [8].output :count
6
+
7
+ par(clk.posedge) do
8
+ hif(rst) { count <= 0 }
9
+ helse { count <= count + inc }
10
+ end
11
+ end
12
+
13
+ # A benchmark for the counter using a constant as the inc input.
14
+ system :dff_bench do
15
+ inner :clk, :rst
16
+ [8].inner :count
17
+ [8].constant inc: 5
18
+
19
+ # counter(:my_counter).(clk,rst,inc,count)
20
+ counter(:my_counter).(clk,rst,5,count)
21
+
22
+ # par do
23
+ # my_counter.inc <= 5
24
+ # count <= my_counter.count
25
+ # end
26
+
27
+ timed do
28
+ clk <= 0
29
+ rst <= 0
30
+ !10.ns
31
+ clk <= 1
32
+ rst <= 0
33
+ !10.ns
34
+ clk <= 0
35
+ rst <= 1
36
+ !10.ns
37
+ clk <= 1
38
+ rst <= 1
39
+ !10.ns
40
+ clk <= 0
41
+ rst <= 0
42
+ !10.ns
43
+ clk <= 1
44
+ !10.ns
45
+ clk <= 0
46
+ !10.ns
47
+ clk <= 1
48
+ !10.ns
49
+ clk <= 0
50
+ !10.ns
51
+ clk <= 1
52
+ !10.ns
53
+ clk <= 0
54
+ !10.ns
55
+ clk <= 1
56
+ !10.ns
57
+ end
58
+ end
data/lib/HDLRuby/hdrcc.rb CHANGED
@@ -380,6 +380,9 @@ $optparse = OptionParser.new do |opts|
380
380
  $options[:rcsim] = v
381
381
  $options[:multiple] = v
382
382
  end
383
+ opts.on("--mute", "The simulator will not generate any output") do |v|
384
+ $options[:mute] = v
385
+ end
383
386
  opts.on("--vcd", "The simulator will generate a vcd file") do |v|
384
387
  $options[:vcd] = v
385
388
  end
@@ -712,8 +715,9 @@ elsif $options[:clang] then
712
715
  $main = File.open($name,"w")
713
716
 
714
717
  # Select the vizualizer depending on the options.
715
- init_visualizer = $options[:vcd] ? "init_vcd_visualizer" :
716
- "init_default_visualizer"
718
+ init_visualizer = $options[:mute] ? "init_mute_visualizer" :
719
+ $options[:vcd] ? "init_vcd_visualizer" :
720
+ "init_default_visualizer"
717
721
 
718
722
  # Gather the system to generate and sort them in the right order
719
723
  # to ensure references are generated before being used.
@@ -857,9 +861,13 @@ elsif $options[:rsim] then
857
861
  HDLRuby.show "#{Time.now}#{show_mem}"
858
862
  # Ruby-level simulation.
859
863
  require 'HDLRuby/hruby_rsim.rb'
860
- # Is VCD output is required.
861
- if $options[:vcd] then
862
- # Yes
864
+ # Is mute or VCD output is required.
865
+ if $options[:mute] then
866
+ # Yes for mute.
867
+ require "HDLRuby/hruby_rsim_mute.rb"
868
+ $top_system.sim($stdout)
869
+ elsif $options[:vcd] then
870
+ # Yes for VCD
863
871
  require "HDLRuby/hruby_rsim_vcd.rb"
864
872
  vcdout = File.open($output+"/hruby_simulator.vcd","w")
865
873
  $top_system.sim(vcdout)
@@ -881,7 +889,8 @@ elsif $options[:rcsim] then
881
889
  $top_system.to_rcsim
882
890
  HDLRuby.show "Executing the hybrid C-Ruby-level simulator..."
883
891
  HDLRuby.show "#{Time.now}#{show_mem}"
884
- HDLRuby::High.rcsim($top_system,"hruby_simulator",$output,$options[:vcd] && true)
892
+ HDLRuby::High.rcsim($top_system,"hruby_simulator",$output,
893
+ ($options[:mute] && 1) || ($options[:vcd] && 2) || 0)
885
894
  HDLRuby.show "End of hybrid C-Ruby-level simulation..."
886
895
  HDLRuby.show "#{Time.now}#{show_mem}"
887
896
  elsif $options[:vhdl] then
@@ -51,7 +51,9 @@ module HDLRuby
51
51
  elsif val.is_a?(Numeric) then
52
52
  # Content is a numeric.
53
53
  @content = []
54
- if val > 0 then
54
+ if val == 0 then
55
+ @content << 0
56
+ elsif val > 0 then
55
57
  while val > 0 do
56
58
  @content << (val & 1)
57
59
  val /= 2
@@ -110,6 +112,11 @@ module HDLRuby
110
112
  return @content
111
113
  end
112
114
 
115
+ # Hash comparison.
116
+ def eql?(bstr)
117
+ return @content.eql?(bstr.raw_content)
118
+ end
119
+
113
120
  # Tells if the bit string is strictly.
114
121
  #
115
122
  # NOTE: return false if the sign is undefined of if it is unknown
@@ -180,10 +187,14 @@ module HDLRuby
180
187
  if right >= left then
181
188
  # puts "left=#{left} right=#{right}"
182
189
  # Get the corresponding bits as a BitString
183
- return BitString.new(@content[left..right],:raw)
190
+ # return BitString.new(@content[left..right],:raw)
191
+ # set to positive.
192
+ return BitString.new(@content[left..right]+[0],:raw)
184
193
  else
185
194
  # Get the corresponding bits as a BitString
186
- return BitString.new(@content[right..left].reverse,:raw)
195
+ # return BitString.new(@content[right..left].reverse,:raw)
196
+ # set to positive.
197
+ return BitString.new(@content[right..left].reverse+[0],:raw)
187
198
  end
188
199
  else
189
200
  # Process the index.
@@ -532,6 +543,7 @@ module HDLRuby
532
543
  val = BitString.new(val)
533
544
  end
534
545
  vcontent = val.raw_content
546
+ # puts "vcontent=#{vcontent}"
535
547
  width = vcontent.size > @content.size ? vcontent.size : @content.size
536
548
  res_content = width.times.map do |i|
537
549
  # Get the bits to compute with
@@ -4213,7 +4213,7 @@ module HDLRuby::High
4213
4213
  # Creates a new +type+ sort of block with possible +name+
4214
4214
  # and build it by executing +ruby_block+.
4215
4215
  def initialize(type, name = :"", &ruby_block)
4216
- # Initialize the block.
4216
+ # Initialize the behavior.
4217
4217
  super(type,name)
4218
4218
 
4219
4219
  unless name.empty? then
@@ -4674,7 +4674,11 @@ module HDLRuby::High
4674
4674
  class ::Integer
4675
4675
  # Converts to a new high-level expression.
4676
4676
  def to_expr
4677
- return Value.new(Integer,self)
4677
+ if (self.bit_length <= 63) then
4678
+ return Value.new(Integer,self)
4679
+ else
4680
+ return Value.new(TypeSigned.new(:"",self.bit_length..0),self)
4681
+ end
4678
4682
  end
4679
4683
  end
4680
4684
 
@@ -5168,9 +5172,9 @@ module HDLRuby::High
5168
5172
 
5169
5173
 
5170
5174
  # Standard vector types.
5171
- Integer = TypeSigned.new(:integer)
5175
+ Integer = TypeSigned.new(:integer,63..0)
5172
5176
  Char = TypeSigned.new(:char,7..0)
5173
- Natural = TypeUnsigned.new(:natural)
5177
+ Natural = TypeUnsigned.new(:natural,63..0)
5174
5178
  Bignum = TypeSigned.new(:bignum,HDLRuby::Infinity..0)
5175
5179
  Real = TypeFloat.new(:float)
5176
5180
 
@@ -4615,8 +4615,8 @@ module HDLRuby::Low
4615
4615
  # Yes so it is also a left value if it is a sub ref.
4616
4616
  if parent.respond_to?(:ref) then
4617
4617
  # It might nor be a sub ref.
4618
- # return parent.ref == self
4619
- return parent.ref.eql?(self)
4618
+ # return parent.ref.eql?(self)
4619
+ return parent.ref.equal?(self)
4620
4620
  else
4621
4621
  # It is necessarily a sub ref (case of RefConcat for now).
4622
4622
  return true
@@ -4624,8 +4624,8 @@ module HDLRuby::Low
4624
4624
  end
4625
4625
  # No, therefore maybe it is directly a left value.
4626
4626
  return (parent.is_a?(Transmit) || parent.is_a?(Connection)) &&
4627
- # parent.left == self
4628
- parent.left.eql?(self)
4627
+ # parent.left.eql?(self)
4628
+ parent.left.equal?(self)
4629
4629
  end
4630
4630
 
4631
4631
  # Tells if the expression is a right value.
@@ -4715,9 +4715,18 @@ module HDLRuby::Low
4715
4715
  # converted to BitString.
4716
4716
  unless content.is_a?(Numeric) or
4717
4717
  content.is_a?(HDLRuby::BitString)
4718
- content = HDLRuby::BitString.new(content.to_s)
4718
+ # content = HDLRuby::BitString.new(content.to_s)
4719
+ content = content.to_s
4720
+ if self.type.unsigned? && content[0] != 0 then
4721
+ content = "0" + content.rjust(self.type.width,content[0])
4722
+ end
4723
+ content = HDLRuby::BitString.new(content)
4719
4724
  end
4720
4725
  @content = content
4726
+ if (@content.is_a?(Numeric) && self.type.unsigned?) then
4727
+ # Adjust the bits for unsigned.
4728
+ @content = @content & (2**self.type.width-1)
4729
+ end
4721
4730
  end
4722
4731
  end
4723
4732
 
@@ -20,6 +20,7 @@ module HDLRuby::Low
20
20
  # h files.
21
21
  def self.includes(*names)
22
22
  res = '#include <stdlib.h>' + "\n" +
23
+ '#include <string.h>' + "\n" +
23
24
  '#include "hruby_sim.h"' + "\n"
24
25
  names.each { |name| res << "#include \"#{name}\"\n" }
25
26
  res << "\n"
@@ -687,6 +688,10 @@ module HDLRuby::Low
687
688
  if time then
688
689
  res << " " * (level+1)*3
689
690
  res << "register_timed_behavior(behavior);\n"
691
+ else
692
+ # Otherwise register it as a behavior to initialize. */
693
+ res << " " * (level+1)*3
694
+ res << "register_init_behavior(behavior);\n"
690
695
  end
691
696
 
692
697
  # Set the owner if any.
@@ -724,12 +729,39 @@ module HDLRuby::Low
724
729
  refs = self.block.each_node_deep.select do |node|
725
730
  node.is_a?(RefName) && !node.leftvalue? &&
726
731
  !node.parent.is_a?(RefName)
732
+ # node.is_a?(RefName) && !node.parent.is_a?(RefName)
727
733
  end.to_a
728
734
  # Keep only one ref per signal.
729
- refs.uniq! { |node| node.full_name }
735
+ refs.uniq! { |ref| ref.full_name }
736
+ # # Remove the intermediate left values if sequential.
737
+ # self.each_block_deep do |blk|
738
+ # if blk.mode == :seq && !blk.parent.is_a?(Behavior) then
739
+ # blk.each_node_deep do |node|
740
+ # if node.is_a?(RefName) && node.leftvalue? &&
741
+ # !node.parent.is_a?(RefName) then
742
+ # puts "removing ref=#{node.full_name}"
743
+ # refs.delete_if {|ref| ref.full_name == node.full_name }
744
+ # end
745
+ # end
746
+ # end
747
+ # end
748
+ # # Remove left values.
749
+ # lefts = refs.select {|ref| ref.leftvalue? }.map do |ref|
750
+ # ref.full_name
751
+ # end
752
+ # puts "lefts=#{lefts}"
753
+ # puts "first refs.size=#{refs.size}"
754
+ # refs.delete_if { |ref| lefts.include?(ref.full_name) }
755
+ # puts "now refs.size=#{refs.size}"
756
+ # puts "refs=#{refs.map {|r| r.full_name}}"
730
757
  # Remove the inner signals from the list.
731
- self.block.each_inner do |inner|
732
- refs.delete_if {|r| r.name == inner.name }
758
+ # self.block.each_inner do |inner|
759
+ # refs.delete_if {|r| r.name == inner.name }
760
+ # end
761
+ self.each_block_deep do |blk|
762
+ blk.each_inner do |inner|
763
+ refs.delete_if {|r| r.name == inner.name }
764
+ end
733
765
  end
734
766
  # Generate the event.
735
767
  events = refs.map {|ref| Event.new(:anyedge,ref.clone) }
@@ -843,6 +875,9 @@ module HDLRuby::Low
843
875
  ## Extends the SignalI class with generation of C text.
844
876
  class SignalI
845
877
 
878
+ # The id of a signal in the simulator.
879
+ @@signal_id = 0
880
+
846
881
  ## Generates the C text for an access to the signal.
847
882
  # +level+ is the hierachical level of the object.
848
883
  # def to_c_signal(level = 0)
@@ -881,6 +916,8 @@ module HDLRuby::Low
881
916
  res << "SignalI signalI = malloc(sizeof(SignalIS));\n"
882
917
  res << " " * (level+1)*3
883
918
  res << "signalI->kind = SIGNALI;\n";
919
+ res << "signalI->id = #{@@signal_id};\n"
920
+ @@signal_id = @@signal_id+1;
884
921
 
885
922
  # Sets the global variable of the signal.
886
923
  res << "\n"
@@ -918,9 +955,9 @@ module HDLRuby::Low
918
955
  if self.value then
919
956
  # There is an initial value.
920
957
  res << " " * (level+1)*3
921
- # res << "copy_value("
922
- # self.value.to_c_expr(res,level+2)
923
- # res << ",signalI->c_value);\n"
958
+ res << "copy_value("
959
+ self.value.to_c_expr(res,level+2)
960
+ res << ",signalI->c_value);\n"
924
961
  res << "copy_value("
925
962
  self.value.to_c_expr(res,level+2)
926
963
  res << ",signalI->f_value);\n"
@@ -1720,26 +1757,49 @@ module HDLRuby::Low
1720
1757
  res << "if (is_defined()) {\n"
1721
1758
  # The condition is testable.
1722
1759
  # Generate the case as a succession of if statements.
1723
- self.each_when do |w|
1760
+ # self.each_when do |w|
1761
+ # res << " " * ((level+2)*3)
1762
+ # res << "dup();\n"
1763
+ # res << " " * ((level+2)*3)
1764
+ # w.match.to_c(res,level+2)
1765
+ # res << "if (to_integer() == to_integer()) { \n"
1766
+ # w.statement.to_c(res,level+3)
1767
+ # res << " " * (level+2)*3
1768
+ # res << "}\n"
1769
+ # end
1770
+ # if self.default then
1771
+ # res << " " * (level+2)*3
1772
+ # res << "else {\n"
1773
+ # self.default.to_c(res,level+3)
1774
+ # res << " " * (level+2)*3
1775
+ # res << "}\n"
1776
+ # end
1777
+ res << " " * ((level+2)*3)
1778
+ res << "int val=to_integer(), done=0;\n"
1779
+ self.each_when.with_index do |w,i|
1724
1780
  res << " " * ((level+2)*3)
1725
- res << "dup();\n"
1781
+ res << "if (!done) {\n" unless i == 0
1726
1782
  res << " " * ((level+2)*3)
1727
1783
  w.match.to_c(res,level+2)
1728
- res << "if (to_integer() == to_integer()) {\n"
1784
+ res << "if (val == to_integer()) {\n"
1729
1785
  w.statement.to_c(res,level+3)
1786
+ res << " " * (level+3)*3
1787
+ res << "done = 1;\n"
1730
1788
  res << " " * (level+2)*3
1789
+ res << "}" unless i == 0
1731
1790
  res << "}\n"
1732
1791
  end
1733
1792
  if self.default then
1734
1793
  res << " " * (level+2)*3
1735
- res << "else {\n"
1794
+ res << "if(!done) {\n"
1736
1795
  self.default.to_c(res,level+3)
1737
1796
  res << " " * (level+2)*3
1738
1797
  res << "}\n"
1739
1798
  end
1799
+
1740
1800
  # Close the case.
1741
1801
  res << " " * (level+1)*3
1742
- res << "pop();\n" # Remove the testing value.
1802
+ # res << "pop();\n" # Remove the testing value.
1743
1803
  res << " " * (level+1)*3
1744
1804
  res << "}\n"
1745
1805
  res << " " * (level)*3
@@ -1827,7 +1887,7 @@ module HDLRuby::Low
1827
1887
  def to_c(res,level = 0)
1828
1888
  # The resulting string.
1829
1889
  res << " " * level*3
1830
- if (number < 0) then
1890
+ if (self.number < 0) then
1831
1891
  # Generate an infinite loop executing the block and waiting.
1832
1892
  res << "for(;;) {\n"
1833
1893
  else
@@ -2053,8 +2113,6 @@ module HDLRuby::Low
2053
2113
  ## Generates the content of the h file.
2054
2114
  # def to_ch
2055
2115
  def to_ch(res)
2056
- # res = ""
2057
- # return "extern Value #{Low2C.make_name(self)}();"
2058
2116
  res << "extern Value " << Low2C.make_name(self) << "();"
2059
2117
  return res
2060
2118
  end
@@ -2067,74 +2125,131 @@ module HDLRuby::Low
2067
2125
  def to_c_make(res,level = 0)
2068
2126
  # Check is the value maker is already present.
2069
2127
  maker = Low2C.make_name(self);
2070
- # return "" if @@made_values.include?(maker)
2071
2128
  return res if @@made_values.include?(maker)
2072
2129
  @@made_values.add(maker)
2073
2130
 
2074
- # The resulting string.
2075
- # res = ""
2076
-
2077
2131
  # The header of the value generation.
2078
2132
  res << " " * level*3
2079
- # res << "Value " << Low2C.make_name(self) << "() {\n"
2080
2133
  res << "Value " << maker << "() {\n"
2081
2134
 
2135
+ # # Declares the data.
2136
+ # # Create the bit string.
2137
+ # # str = self.content.is_a?(BitString) ?
2138
+ # # self.content.to_s : self.content.to_s(2).rjust(32,"0")
2139
+ # if self.content.is_a?(BitString) then
2140
+ # str = self.content.is_a?(BitString) ?
2141
+ # self.content.to_s : self.content.to_s(2).rjust(32,"0")
2142
+ # else
2143
+ # # sign = self.content>=0 ? "0" : "1"
2144
+ # # str = self.content.abs.to_s(2).rjust(width,sign).upcase
2145
+ # if self.content >= 0 then
2146
+ # str = self.content.to_s(2).rjust(width,"0").upcase
2147
+ # else
2148
+ # # Compute the extension to the next multiple
2149
+ # # of int_width
2150
+ # ext_width = (((width-1) / Low2C.int_width)+1)*Low2C.int_width
2151
+ # # Convert the string.
2152
+ # str = (2**ext_width+self.content).to_s(2).upcase
2153
+ # end
2154
+ # # puts "content=#{self.content} str=#{str}"
2155
+ # end
2156
+ # # Is it a fully defined number?
2157
+ # # NOTE: bignum values are not supported by the simulation engine
2158
+ # # yet, therefore numeric values are limited to 64 max.
2159
+ # if str =~ /^[01]+$/ && str.length <= 64 then
2160
+ # # Yes, generate a numeral value.
2161
+ # res << " " * (level+1)*3
2162
+ # res << "static unsigned int data[] = { "
2163
+ # res << str.scan(/.{1,#{Low2C.int_width}}/m).reverse.map do |sub|
2164
+ # sub.to_i(2).to_s # + "ULL"
2165
+ # end.join(",")
2166
+ # res << ", 0" if (str.length <= 32)
2167
+ # res << " };\n"
2168
+ # # Create the value.
2169
+ # res << " " * (level+1)*3
2170
+ # # puts "str=#{str} type width=#{self.type.width} signed? #{type.signed?}"
2171
+ # # res << "return make_set_value(#{self.type.to_c(level+1)},1," +
2172
+ # # "data);\n"
2173
+ # res << "return make_set_value("
2174
+ # self.type.to_c(res,level+1)
2175
+ # res << ",1,data);\n"
2176
+ # else
2177
+ # # No, generate a bit string value.
2178
+ # res << " " * (level+1)*3
2179
+ # # res << "static unsigned char data[] = \"#{str}\";\n"
2180
+ # res << "static unsigned char data[] = \"#{str.reverse}\";\n"
2181
+ # # Create the value.
2182
+ # res << " " * (level+1)*3
2183
+ # # res << "return make_set_value(#{self.type.to_c(level+1)},0," +
2184
+ # # "data);\n"
2185
+ # res << "return make_set_value("
2186
+ # self.type.to_c(res,level+1)
2187
+ # res << ",0,data);\n"
2188
+ # end
2189
+
2082
2190
  # Declares the data.
2083
- # Create the bit string.
2084
- # str = self.content.is_a?(BitString) ?
2085
- # self.content.to_s : self.content.to_s(2).rjust(32,"0")
2086
- if self.content.is_a?(BitString) then
2087
- str = self.content.is_a?(BitString) ?
2088
- self.content.to_s : self.content.to_s(2).rjust(32,"0")
2089
- else
2090
- # sign = self.content>=0 ? "0" : "1"
2091
- # str = self.content.abs.to_s(2).rjust(width,sign).upcase
2092
- if self.content >= 0 then
2093
- str = self.content.to_s(2).rjust(width,"0").upcase
2191
+ if self.content.is_a?(::Integer) then
2192
+ if self.type.width <= 64 then
2193
+ res << " " * (level+1)*3
2194
+ res << "Value value = make_value("
2195
+ self.type.to_c(res,level+1)
2196
+ res << ",1);\n"
2197
+ # res << " " * (level+1)*3
2198
+ # res << "value->numeric = 1;\n"
2199
+ res << " " * (level+1)*3
2200
+ res << "value->capacity = 0;\n"
2201
+ res << " " * (level+1)*3
2202
+ res << "value->data_str = NULL;\n"
2203
+ res << " " * (level+1)*3
2204
+ if self.content.bit_length <= 63 then
2205
+ res << "value->data_int = #{self.content}LLU;\n"
2206
+ else
2207
+ res << "value->data_int = "
2208
+ res << "#{self.content & 0xFFFFFFFFFFFF}LLU;\n"
2209
+ end
2210
+ # Close the value.
2211
+ res << " " * (level+1)*3
2212
+ res << "return value;\n"
2213
+ res << " " * level*3
2214
+ res << "}\n\n"
2215
+ # Return the result.
2216
+ return res
2094
2217
  else
2095
- # Compute the extension to the next multiple
2096
- # of int_width
2097
- ext_width = (((width-1) / Low2C.int_width)+1)*Low2C.int_width
2098
- # Convert the string.
2099
- str = (2**ext_width+self.content).to_s(2).upcase
2218
+ str = self.content.to_s(2)
2219
+ # if str[-1] == "-" then
2220
+ # str[-1] = "1"
2221
+ # elsif str[-1] == "1" then
2222
+ # str = "0" + str
2223
+ # end
2224
+ if self.content < 0 then
2225
+ str = (2**self.type.width + self.content).to_s(2)
2226
+ str = "1" * (self.type.width-str.length) + str
2227
+ else
2228
+ str = self.content.to_s(2)
2229
+ str = "0" * (self.type.width-str.length) + str
2230
+ end
2231
+ str.reverse!
2100
2232
  end
2101
- # puts "content=#{self.content} str=#{str}"
2102
- end
2103
- # Is it a fully defined number?
2104
- # NOTE: bignum values are not supported by the simulation engine
2105
- # yet, therefore numeric values are limited to 64 max.
2106
- if str =~ /^[01]+$/ && str.length <= 64 then
2107
- # Yes, generate a numeral value.
2108
- res << " " * (level+1)*3
2109
- res << "static unsigned int data[] = { "
2110
- res << str.scan(/.{1,#{Low2C.int_width}}/m).reverse.map do |sub|
2111
- sub.to_i(2).to_s # + "ULL"
2112
- end.join(",")
2113
- res << ", 0" if (str.length <= 32)
2114
- res << " };\n"
2115
- # Create the value.
2116
- res << " " * (level+1)*3
2117
- # puts "str=#{str} type width=#{self.type.width} signed? #{type.signed?}"
2118
- # res << "return make_set_value(#{self.type.to_c(level+1)},1," +
2119
- # "data);\n"
2120
- res << "return make_set_value("
2121
- self.type.to_c(res,level+1)
2122
- res << ",1,data);\n"
2123
2233
  else
2124
- # No, generate a bit string value.
2125
- res << " " * (level+1)*3
2126
- # res << "static unsigned char data[] = \"#{str}\";\n"
2127
- res << "static unsigned char data[] = \"#{str.reverse}\";\n"
2128
- # Create the value.
2129
- res << " " * (level+1)*3
2130
- # res << "return make_set_value(#{self.type.to_c(level+1)},0," +
2131
- # "data);\n"
2132
- res << "return make_set_value("
2133
- self.type.to_c(res,level+1)
2134
- res << ",0,data);\n"
2234
+ str = content.to_s.reverse
2135
2235
  end
2236
+ str = str.ljust(self.type.width,str[-1])
2237
+ res << " " * (level+1)*3
2238
+ res << "Value value = make_value("
2239
+ self.type.to_c(res,level+1)
2240
+ res << ",1);\n"
2241
+ res << " " * (level+1)*3
2242
+ res << "value->numeric = 0;\n"
2243
+ res << " " * (level+1)*3
2244
+ res << "value->capacity = #{str.length+1};"
2245
+ res << " " * (level+1)*3
2246
+ res << "value->data_str = calloc(value->capacity,sizeof(char));\n"
2247
+ res << " " * (level+1)*3
2248
+ res << "strcpy(value->data_str,\"#{str}\");\n"
2136
2249
 
2137
2250
  # Close the value.
2251
+ res << " " * (level+1)*3
2252
+ res << "return value;\n"
2138
2253
  res << " " * level*3
2139
2254
  res << "}\n\n"
2140
2255
  # Return the result.
@@ -2142,6 +2257,7 @@ module HDLRuby::Low
2142
2257
  end
2143
2258
  end
2144
2259
 
2260
+
2145
2261
  ## Extends the Cast class with generation of C text.
2146
2262
  class Cast
2147
2263