HDLRuby 2.2.3 → 2.2.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7c97f2a40be4ad9b440b2a76fbb993c28c8a1ff3ca6d33b3fb6ea134361489ca
4
- data.tar.gz: 5a7909585987b60e481ac58f14d631bf1bfe60c538233a1709751bd5cf23faa9
3
+ metadata.gz: 970d857a0599c47d617e6a3d4be7720134a33adc009a3c069332fa198ef05a3f
4
+ data.tar.gz: a81688812f9a76bf80a56d2d3aabb59caf507dd3cd4897d37ced83c3f2319f03
5
5
  SHA512:
6
- metadata.gz: '0958174494199a7c5b65e5ac5d6e2657969310615b4dd078ac31f52e144228d6450a9bcb437fa54d5c8403e34244a09fb8e4226ed3972b35df677f15748b3287'
7
- data.tar.gz: 156e11a28ab129b92f27ce205fb5cde89109b70120233da58fb14753cc893af842729eb970713aa5131bb8935f157c37bc67b0ff6c1d3add7c4fd2a389a7f458
6
+ metadata.gz: 1b2e23d1c84cb1a7e4e3bcb16b90f409caaa6ded6855b85590ee10de2d378976f44f35612b955b710ed4dc7bd7b316b0a3c2e1a1d1a1b8a74a34051e49b3459b
7
+ data.tar.gz: 92c75812d649592042da377556762c64aa43d2c2ceca6515f3424cec41c0e79ed2c81880f7e566cb6ea5ffdbb9c6d3f1106ae8c1750b38fe4283e4c5c4f0648b
@@ -2045,11 +2045,11 @@ module HDLRuby::High
2045
2045
  # return If.new(condition) { self }
2046
2046
  # Remove self from the current block.
2047
2047
  obj = self
2048
- High.cur_block.delete_statement!(obj)
2048
+ ::HDLRuby::High.cur_block.delete_statement!(obj)
2049
2049
  # Creates the if statement.
2050
2050
  stmnt = If.new(condition) { add_statement(obj) }
2051
2051
  # Add it to the current block.
2052
- High.cur_block.add_statement(stmnt)
2052
+ ::HDLRuby::High.cur_block.add_statement(stmnt)
2053
2053
  # Returns the result.
2054
2054
  return stmnt
2055
2055
  end
@@ -3340,7 +3340,7 @@ module HDLRuby::Low
3340
3340
 
3341
3341
  # Clones the TimeRepeat (deeply)
3342
3342
  def clone
3343
- return TimeRepeat(@statement.clone,@delay.clone)
3343
+ return TimeRepeat.new(@statement.clone,@delay.clone)
3344
3344
  end
3345
3345
 
3346
3346
  # Iterates over the expression children if any.
@@ -620,8 +620,9 @@ module HDLRuby::Low
620
620
 
621
621
  # Is it a clocked behavior?
622
622
  events = self.each_event.to_a
623
- if events.empty? then
623
+ if events.empty? && !self.is_a?(TimeBehavior) then
624
624
  # No events, this is not a clock behavior.
625
+ # And it is not a time behavior neigther.
625
626
  # Generate the events list from the right values.
626
627
  # First get the references.
627
628
  refs = self.block.each_node_deep.select do |node|
@@ -1429,10 +1430,15 @@ module HDLRuby::Low
1429
1430
 
1430
1431
  # Declares the data.
1431
1432
  # Create the bit string.
1432
- str = self.content.is_a?(BitString) ?
1433
- self.content.to_s : self.content.to_s(2).rjust(32,"0")
1434
- # Sign extend.
1435
- str = str.rjust(self.type.width, self.type.signed ? str[-1] : "0")
1433
+ # str = self.content.is_a?(BitString) ?
1434
+ # self.content.to_s : self.content.to_s(2).rjust(32,"0")
1435
+ if self.content.is_a?(BitString) then
1436
+ str = self.content.is_a?(BitString) ?
1437
+ self.content.to_s : self.content.to_s(2).rjust(32,"0")
1438
+ else
1439
+ sign = self.content>=0 ? "0" : "1"
1440
+ str = self.content.abs.to_s(2).rjust(width,sign).upcase
1441
+ end
1436
1442
  # Is it a fully defined number?
1437
1443
  if str =~ /^[01]+$/ then
1438
1444
  # Yes, generate a numeral value.
@@ -727,11 +727,20 @@ module HDLRuby::Low
727
727
  # It is assumed that the inners are all in declared in the
728
728
  # direct sub block and that they represent variables, i.e.,
729
729
  # Low::to_upper_space! and Low::with_var! has been called.
730
- vars = self.block.each_inner.to_a
730
+ vars = self.block.each_inner.to_a
731
731
 
732
732
  # The resulting string.
733
- res = " " * (level*3)
733
+ res = ""
734
+
735
+ # Generate the TimeRepeat as different processes if any.
736
+ self.block.each_statement_deep do |stmnt|
737
+ if stmnt.is_a?(TimeRepeat) then
738
+ res << stmnt.process_to_vhdl(vars,level)
739
+ end
740
+ end
741
+
734
742
  # Generate the header.
743
+ res << " " * (level*3)
735
744
  unless self.block.name.empty? then
736
745
  res << Low2VHDL.vhdl_name(self.block.name) << ": "
737
746
  end
@@ -797,6 +806,11 @@ module HDLRuby::Low
797
806
  # Generate the body directly.
798
807
  res << self.block.to_vhdl(vars,level+1)
799
808
  end
809
+ # Insert an infinite wait is the top block is a timed block.
810
+ if self.block.is_a?(TimeBlock) then
811
+ res << " " * ((level+1)*3)
812
+ res << "wait;\n"
813
+ end
800
814
  # Close the process.
801
815
  res << " " * (level*3)
802
816
  res << "end process;\n\n"
@@ -990,12 +1004,41 @@ module HDLRuby::Low
990
1004
 
991
1005
  ## Extends the TimeRepeat class with generation of HDLRuby::High text.
992
1006
  class TimeRepeat
993
-
994
1007
  # Generates the text of the equivalent HDLRuby::High code.
995
1008
  # +vars+ is the list of the variables and
996
1009
  # +level+ is the hierachical level of the object.
997
1010
  def to_vhdl(vars,level = 0)
998
- raise AnyError, "Internal error: TimeRepeat not supported yet for conversion to VHDL."
1011
+ # Nothing to do, see process_to_vhdl
1012
+ return ""
1013
+ end
1014
+
1015
+ # Generates the text of the equivalent HDLRuby::High code as a new
1016
+ # process.
1017
+ # +vars+ is the list of the variables and
1018
+ # +level+ is the hierachical level of the object.
1019
+ def process_to_vhdl(vars,level = 0)
1020
+ # Generate a separate process for the repeated statement with
1021
+ # a wait.
1022
+ # The resulting string.
1023
+ res = " " * (level*3)
1024
+ # Generate the header.
1025
+ unless self.block.name.empty? then
1026
+ res << Low2VHDL.vhdl_name(self.block.name) << ": "
1027
+ end
1028
+ res << "process \n"
1029
+ # Generate the content.
1030
+ res << " " * (level*3)
1031
+ res << "begin\n"
1032
+ # Adds the wait.
1033
+ res << " " * ((level+1)*3)
1034
+ res << "wait for " << self.delay.to_vhdl(level) << ";\n"
1035
+ # Generate the remaining of the body.
1036
+ res << self.statement.to_vhdl(vars,level+1)
1037
+ # Close the process.
1038
+ res << " " * (level*3)
1039
+ res << "end process;\n\n"
1040
+ # Return the result.
1041
+ return res
999
1042
  end
1000
1043
  end
1001
1044
 
@@ -1107,7 +1150,8 @@ module HDLRuby::Low
1107
1150
  /[01]/ =~ self.content[-1] ? "0" : self.content[-1]
1108
1151
  return '"' + self.content.to_s.rjust(width,sign).upcase + '"'
1109
1152
  else
1110
- sign = self.type.signed? ? (self.content>=0 ? "0" : "1") : "0"
1153
+ # sign = self.type.signed? ? (self.content>=0 ? "0" : "1") : "0"
1154
+ sign = self.content>=0 ? "0" : "1"
1111
1155
  return '"' + self.content.abs.to_s(2).rjust(width,sign).upcase + '"'
1112
1156
  end
1113
1157
  end
@@ -129,6 +129,17 @@ module HDLRuby::Low
129
129
  end
130
130
  end
131
131
 
132
+ ## Extends the TimeRepeat class with functionality for converting booleans
133
+ # in assignments to setlect operators.
134
+ class TimeRepeat
135
+ # Converts booleans in assignments to select operators.
136
+ def boolean_in_assign2select!
137
+ # Simply recurse on the stamtement.
138
+ self.statement.boolean_in_assign2select!
139
+ return self
140
+ end
141
+ end
142
+
132
143
 
133
144
  ## Extends the Block class with functionality for converting booleans
134
145
  # in assignments to select operators.
@@ -436,7 +436,7 @@ module HDLRuby::Low
436
436
  # Assign the replaced nodes.
437
437
  node2rep_done.each do |node,rep|
438
438
  reassign = node2reassign[node][1].clone
439
- self.parent.
439
+ self.parent.parent.
440
440
  add_connection(Connection.new(reassign,node.clone))
441
441
  end
442
442
  end
@@ -108,6 +108,20 @@ module HDLRuby::Low
108
108
  end
109
109
 
110
110
 
111
+ ## Extends the TimeRepeat class with functionality for converting booleans
112
+ # in assignments to select operators.
113
+ class TimeRepeat
114
+ # Extract the Select expressions.
115
+ def extract_selects!
116
+ # Simply recruse on the statement.
117
+ if self.statement.is_a?(Block) then
118
+ return []
119
+ else
120
+ return self.statement.extract_selects!
121
+ end
122
+ end
123
+ end
124
+
111
125
 
112
126
  ## Extends the Block class with functionality for converting select
113
127
  # expressions to case statements.
@@ -113,6 +113,65 @@ class Block
113
113
  puts "Block to_verilog not found" # For debugging
114
114
  end
115
115
 
116
+ # Extract and convert to verilog the TimeRepeat statements.
117
+ # NOTE: work only on the current level of the block (should be called
118
+ # through each_block_deep).
119
+ def repeat_to_verilog!
120
+ code = ""
121
+ # Gather the TimeRepeat statements.
122
+ repeats = self.each_statement.find_all { |st| st.is_a?(TimeRepeat) }
123
+ # Remove them from the block.
124
+ repeats.each { |st| self.delete_statement!(st) }
125
+ # Generate them separately in timed always processes.
126
+ repeats.each do |st|
127
+ code << " always #{st.delay.to_verilog} begin\n"
128
+
129
+ # Perform "scheduling" using the method "flatten".
130
+ block = st.statement.flatten(st.statement.mode.to_s)
131
+
132
+ # Declaration of "inner" part within "always".
133
+ block.each_inner do |inner|
134
+ # if regs.include?(inner.name) then
135
+ if regs.include?(inner.to_verilog) then
136
+ code << " reg"
137
+ else
138
+ code << " wire"
139
+ end
140
+
141
+ # Variable has "base", but if there is width etc, it is not in "base".
142
+ # It is determined by an if.
143
+ if inner.type.base?
144
+ if inner.type.base.base?
145
+ # code << "#{inner.type.base.to_verilog} #{inner.to_verilog} #{inner.type.to_verilog};\n"
146
+ code << "#{inner.type.base.to_verilog} #{inner.to_verilog} #{inner.type.to_verilog}"
147
+ else
148
+ # code << "#{inner.type.to_verilog} #{inner.to_verilog};\n"
149
+ code << "#{inner.type.to_verilog} #{inner.to_verilog}"
150
+ end
151
+ else
152
+ # code << " #{inner.type.to_verilog}#{inner.to_verilog};\n"
153
+ code << " #{inner.type.to_verilog}#{inner.to_verilog}"
154
+ end
155
+ if inner.value then
156
+ # There is an initial value.
157
+ code << " = #{inner.value.to_verilog}"
158
+ end
159
+ code << ";\n"
160
+ end
161
+
162
+ # Translate the block that finished scheduling.
163
+ block.each_statement do |statement|
164
+ code << "\n #{statement.to_verilog(block.mode.to_s)}"
165
+ end
166
+
167
+ $fm.fm_par.clear()
168
+
169
+ code << "\n end\n\n"
170
+ end
171
+ return code
172
+ end
173
+
174
+
116
175
  # Process top layer of Block.
117
176
  # Determine whether there is a block under block and convert it.
118
177
  def flatten(mode = nil)
@@ -1587,20 +1646,20 @@ end
1587
1646
  # One of two people, TimeWait and Delay.
1588
1647
  class TimeWait
1589
1648
  def to_verilog(mode=nil)
1590
- return self.delay.to_verilog
1649
+ return self.delay.to_verilog + "\n"
1591
1650
  end
1592
1651
  end
1593
1652
  class Delay
1594
1653
  def to_verilog
1595
1654
  time = self.value.to_s
1596
1655
  if(self.unit.to_s == "ps") then
1597
- return "##{time}\n"
1656
+ return "##{time}"
1598
1657
  elsif(self.unit.to_s == "ns")
1599
- return "##{time}000\n"
1658
+ return "##{time}000"
1600
1659
  elsif(self.unit.to_s == "us")
1601
- return "##{time}000000\n"
1660
+ return "##{time}000000"
1602
1661
  elsif(self.unit.to_s == "ms")
1603
- return "##{time}000000000\n"
1662
+ return "##{time}000000000"
1604
1663
  end
1605
1664
  end
1606
1665
  end
@@ -1691,7 +1750,10 @@ class SystemT
1691
1750
  end
1692
1751
  # When only input is used, it is necessary to close (), so it branches with if.
1693
1752
  if outputs.empty? && inout.empty? then
1694
- code << " #{inputs.last.to_verilog} ); \n" unless inputs.empty?
1753
+ # code << " #{inputs.last.to_verilog} ); \n" unless inputs.empty?
1754
+ if (inputs.empty?)
1755
+ code << " ); \n"
1756
+ end
1695
1757
  else
1696
1758
  code << " #{inputs.last.to_verilog}," unless inputs.empty?
1697
1759
  end
@@ -1896,8 +1958,14 @@ class SystemT
1896
1958
  # Translation of behavior part (always).
1897
1959
  self.each_behavior do |behavior|
1898
1960
  if behavior.block.is_a?(TimeBlock) then
1961
+ # Extract and translate the TimeRepeat separately.
1962
+ behavior.each_block_deep do |blk|
1963
+ code << blk.repeat_to_verilog!
1964
+ end
1965
+ # And generate an initial block.
1899
1966
  code << " initial begin\n"
1900
1967
  else
1968
+ # Generate a standard process.
1901
1969
  code << " always @( "
1902
1970
  # If there is no "always" condition, it is always @("*").
1903
1971
  if behavior.each_event.to_a.empty? then
@@ -143,6 +143,13 @@ extern Value add_value(Value src0, Value src1, Value dst);
143
143
  * @return dst */
144
144
  extern Value sub_value(Value src0, Value src1, Value dst);
145
145
 
146
+ /** Computes the multiplication of two general values.
147
+ * @param src0 the first source value of the addition
148
+ * @param src1 the second source value of the addition
149
+ * @param dst the destination value
150
+ * @return dst */
151
+ extern Value mul_value(Value src0, Value src1, Value dst);
152
+
146
153
  /** Computes the not of a value.
147
154
  * @param src the source value of the not
148
155
  * @param dst the destination value
@@ -238,9 +238,9 @@ void resize_value(Value value, int size) {
238
238
  * @param data the source data */
239
239
  void set_value(Value value, int numeric, void* data) {
240
240
  value->numeric = numeric;
241
- if (numeric)
241
+ if (numeric) {
242
242
  value->data_int = *((unsigned long long*)data);
243
- else {
243
+ } else {
244
244
  memcpy(value->data_str,data,type_width(value->type)*sizeof(char));
245
245
  }
246
246
  }
@@ -359,7 +359,7 @@ static Value set_bitstring_value(Value src, Value dst) {
359
359
  unsigned long long i;
360
360
  /* Resize dst to match the width. */
361
361
  resize_value(dst,width);
362
- /* set the type and size of the destination the the type of the source. */
362
+ /* Set the type and size of the destination from the type of the source.*/
363
363
  dst->type = src->type;
364
364
  dst->numeric = 0;
365
365
 
@@ -379,6 +379,29 @@ static Value set_bitstring_value(Value src, Value dst) {
379
379
  }
380
380
 
381
381
 
382
+ /** Sets a value to undefined.
383
+ * @param dst the destination value
384
+ * @return the destination value */
385
+ static Value set_undefined_bitstring(Value dst) {
386
+ /* Compute the width of the result in bits. */
387
+ unsigned long long width = type_width(dst->type);
388
+
389
+ /* set the type and size of the destination. */
390
+ dst->numeric = 0;
391
+
392
+ /* Get access to the destination data. */
393
+ char* dst_data = dst->data_str;
394
+
395
+ /* undefine the destination. */
396
+ unsigned long long count;
397
+ for(count = 0; count < width; ++count) {
398
+ dst_data[count] = 'x';
399
+ }
400
+ /* Return the destination. */
401
+ return dst;
402
+ }
403
+
404
+
382
405
  /** Computes the neg of a bitstring value.
383
406
  * @param src the source value of the not
384
407
  * @param dst the destination value
@@ -389,7 +412,7 @@ static Value neg_value_bitstring(Value src, Value dst) {
389
412
 
390
413
  /* Update the destination capacity if required. */
391
414
  resize_value(dst,width);
392
- /* set the type and size of the destination the the type of the source. */
415
+ /* Set the type and size of the destination from the type of the source.*/
393
416
  dst->type = src->type;
394
417
  dst->numeric = 0;
395
418
 
@@ -434,7 +457,7 @@ static Value add_value_bitstring(Value src0, Value src1, Value dst) {
434
457
 
435
458
  /* Update the destination capacity if required. */
436
459
  resize_value(dst,width0);
437
- /* set the type and size of the destination the the type of the source. */
460
+ /* Set the type and size of the destination from the type of the source.*/
438
461
  dst->type = src0->type;
439
462
  dst->numeric = 0;
440
463
 
@@ -503,7 +526,7 @@ static Value sub_value_bitstring(Value src0, Value src1, Value dst) {
503
526
 
504
527
  /* Update the destination capacity if required. */
505
528
  resize_value(dst,width0);
506
- /* set the type and size of the destination the the type of the source. */
529
+ /* Set the type and size of the destination from the type of the source.*/
507
530
  dst->type = src0->type;
508
531
  dst->numeric = 0;
509
532
 
@@ -572,7 +595,7 @@ static Value not_value_bitstring(Value src, Value dst) {
572
595
 
573
596
  /* Update the destination capacity if required. */
574
597
  resize_value(dst,width);
575
- /* set the type and size of the destination the the type of the source. */
598
+ /* Set the type and size of the destination from the type of the source.*/
576
599
  dst->type = src->type;
577
600
  dst->numeric = 0;
578
601
 
@@ -611,7 +634,7 @@ static Value and_value_bitstring(Value src0, Value src1, Value dst) {
611
634
 
612
635
  /* Update the destination capacity if required. */
613
636
  resize_value(dst,width0);
614
- /* set the type and size of the destination the the type of the source. */
637
+ /* Set the type and size of the destination from the type of the source.*/
615
638
  dst->type = src0->type;
616
639
  dst->numeric = 0;
617
640
 
@@ -680,7 +703,7 @@ static Value or_value_bitstring(Value src0, Value src1, Value dst) {
680
703
 
681
704
  /* Update the destination capacity if required. */
682
705
  resize_value(dst,width0);
683
- /* set the type and size of the destination the the type of the source. */
706
+ /* Set the type and size of the destination from the type of the source.*/
684
707
  dst->type = src0->type;
685
708
  dst->numeric = 0;
686
709
 
@@ -749,7 +772,7 @@ static Value xor_value_bitstring(Value src0, Value src1, Value dst) {
749
772
 
750
773
  /* Update the destination capacity if required. */
751
774
  resize_value(dst,width0);
752
- /* set the type and size of the destination the the type of the source. */
775
+ /* Set the type and size of the destination from the type of the source.*/
753
776
  dst->type = src0->type;
754
777
  dst->numeric = 0;
755
778
 
@@ -953,7 +976,7 @@ static Value equal_value_bitstring(Value src0, Value src1, Value dst) {
953
976
 
954
977
  /* Update the destination capacity if required. */
955
978
  resize_value(dst,width0);
956
- /* set the type and size of the destination the the type of the source. */
979
+ /* Set the type and size of the destination from the type of the source.*/
957
980
  dst->type = src0->type;
958
981
  dst->numeric = 0;
959
982
 
@@ -1026,7 +1049,7 @@ static Value select_value_bitstring(Value cond, Value dst, unsigned int num,
1026
1049
 
1027
1050
  /* Update the destination capacity if required. */
1028
1051
  resize_value(dst,width);
1029
- /* set the type and size of the destination the the type of the source. */
1052
+ /* Set the type and size of the destination from the type of the source.*/
1030
1053
  dst->type = src->type;
1031
1054
  dst->numeric = 0;
1032
1055
  char *dst_data = dst->data_str;
@@ -1098,7 +1121,7 @@ static Value cast_value_bitstring(Value src, Type type, Value dst) {
1098
1121
 
1099
1122
  /* Update the destination capacity if required. */
1100
1123
  resize_value(dst,width);
1101
- /* set the type and size of the destination the the type of the source. */
1124
+ /* Set the type and size of the destination from the type of the source.*/
1102
1125
  dst->type = type;
1103
1126
  dst->numeric = 0;
1104
1127
 
@@ -1221,7 +1244,7 @@ Value read_range_bitstring(Value src, long long first, long long last,
1221
1244
 
1222
1245
  /* Update the destination capacity if required. */
1223
1246
  resize_value(dst,length);
1224
- /* set the type and size of the destination the the type of the source. */
1247
+ /* Set the type and size of the destination from the type of the source.*/
1225
1248
  dst->type = make_type_vector(get_type_bit(),length);
1226
1249
  dst->numeric = 0;
1227
1250
 
@@ -1249,6 +1272,7 @@ Value write_range_bitstring(Value src, long long first, long long last,
1249
1272
  last = first;
1250
1273
  first = tmp;
1251
1274
  }
1275
+ // printf("Initially first=%lld, last=%lld\n",first,last);
1252
1276
  /* Get the widths of the source and the desintation. */
1253
1277
  unsigned long long src_width = type_width(src->type);
1254
1278
  unsigned long long dst_width = type_width(dst->type);
@@ -1256,6 +1280,8 @@ Value write_range_bitstring(Value src, long long first, long long last,
1256
1280
  unsigned long long bw = dst->type->base;
1257
1281
  first *= bw;
1258
1282
  last *= bw;
1283
+ last += bw-1;
1284
+ // printf("bw=%lld, first=%lld, last=%lld\n",bw,first,last);
1259
1285
  /* Access the source and destination bitstring data. */
1260
1286
  char* dst_data = dst->data_str;
1261
1287
  char* src_data = src->data_str;
@@ -1354,6 +1380,22 @@ static Value sub_value_numeric(Value src0, Value src1, Value dst) {
1354
1380
  }
1355
1381
 
1356
1382
 
1383
+ /** Computes the multiplication of two numeric values.
1384
+ * @param src0 the first source value of the addition
1385
+ * @param src1 the second source value of the addition
1386
+ * @param dst the destination value
1387
+ * @return dst */
1388
+ static Value mul_value_numeric(Value src0, Value src1, Value dst) {
1389
+ /* Sets state of the destination using the first source. */
1390
+ dst->type = src0->type;
1391
+ dst->numeric = 1;
1392
+
1393
+ /* Perform the addition. */
1394
+ dst->data_int = src0->data_int * src1->data_int;
1395
+ return dst;
1396
+ }
1397
+
1398
+
1357
1399
  /** Computes the NOT of a numeric value.
1358
1400
  * @param src the source value of the not
1359
1401
  * @param dst the destination value
@@ -1605,7 +1647,7 @@ Value read_range_numeric(Value value, long long first, long long last,
1605
1647
  length *= bw;
1606
1648
  // printf("first=%lld last=%lld bw=%llu length=%lld\n",first,last,bw,length);
1607
1649
 
1608
- /* set the type and size of the destination the the type of the source. */
1650
+ /* Set the type and size of the destination from the type of the source.*/
1609
1651
  dst->type = make_type_vector(get_type_bit(),length);
1610
1652
  dst->numeric = 1;
1611
1653
 
@@ -1748,6 +1790,27 @@ Value sub_value(Value src0, Value src1, Value dst) {
1748
1790
  }
1749
1791
 
1750
1792
 
1793
+ /** Computes the multiplication of two general values.
1794
+ * @param src0 the first source value of the addition
1795
+ * @param src1 the second source value of the addition
1796
+ * @param dst the destination value
1797
+ * @return dst */
1798
+ Value mul_value(Value src0, Value src1, Value dst) {
1799
+ /* Might allocate a new value so save the current pool state. */
1800
+ unsigned int pos = get_value_pos();
1801
+ /* Do a numeric computation if possible, otherwise fallback to bitstring
1802
+ * computation. */
1803
+ if (src0->numeric && src1->numeric) {
1804
+ /* Both sources are numeric. */
1805
+ return mul_value_numeric(src0,src1,dst);
1806
+ } else {
1807
+ /* Cannot compute (for now), simply undefines the destination. */
1808
+ set_undefined_bitstring(dst);
1809
+ }
1810
+ return dst;
1811
+ }
1812
+
1813
+
1751
1814
  /** Computes the NOT of a general value.
1752
1815
  * @param src the source value of the not
1753
1816
  * @param dst the destination value
@@ -2199,14 +2262,14 @@ RefRangeS make_ref_rangeS(SignalI signal, unsigned long long first,
2199
2262
  * @param value the value to convert
2200
2263
  * @return the resulting int. */
2201
2264
  unsigned long long value2integer(Value value) {
2265
+ unsigned long long width = type_width(value->type);
2202
2266
  /* If the value is numeric, just return its data as is. */
2203
2267
  if (value->numeric) {
2204
- return value->data_int;
2268
+ return value->data_int & ~((unsigned long long)(-1LL) << width);
2205
2269
  }
2206
2270
  /* Otherwise convert the bitstring to an integer if possible,
2207
2271
  * but return 0 in case of failure. */
2208
2272
  /* Gets the width of the value. */
2209
- unsigned long long width = type_width(value->type);
2210
2273
  unsigned long long res = 0;
2211
2274
  unsigned long long i;
2212
2275
  char bit;
@@ -496,7 +496,7 @@ void transmit_to_signal_range(Value value, RefRangeS ref) {
496
496
  SignalI signal = ref.signal;
497
497
  unsigned long long first = ref.first;
498
498
  unsigned long long last = ref.last;
499
- // printf("Tansmit to signal range: %s(%p)\n",signal->name,signal);
499
+ // printf("Tansmit to signal range: %s(%p) [%lld:%lld]\n",signal->name,signal,first,last);
500
500
  /* Can transmit, copy the content. */
501
501
  if (signal->fading)
502
502
  signal->f_value = write_range(value,first,last,signal->f_value);
@@ -747,7 +747,9 @@ module HDLRuby::High::Std
747
747
  obj = self
748
748
  # Make the inner connection
749
749
  port_pairs.each do |sig, port|
750
- port.to_ref <= sig
750
+ sig.parent.open do
751
+ port.to_ref <= sig
752
+ end
751
753
  end
752
754
 
753
755
  # Set ups the accesser's namespace
@@ -47,7 +47,7 @@ HDLRuby::High::Std.channel(:mem_sync) do |n,typ,size,clk_e,rst,br_rsts = []|
47
47
  inner :"rwb_#{p}" # Read/!Write
48
48
  end
49
49
  # Declare the memory content.
50
- typ[awidth].inner :mem
50
+ typ[-size].inner :mem
51
51
 
52
52
  # Defines the ports of the memory as branchs of the channel.
53
53
  n.times do |p|
@@ -241,7 +241,7 @@ HDLRuby::High::Std.channel(:mem_dual) do |typ,size,clk,rst,br_rsts = {}|
241
241
  [awidth].inner :abus_r_reg
242
242
 
243
243
  # Declare the memory content.
244
- typ[awidth].inner :mem
244
+ typ[-size].inner :mem
245
245
 
246
246
  # Processes handling the memory access.
247
247
  par(clk.posedge) do
@@ -339,9 +339,14 @@ HDLRuby::High::Std.channel(:mem_dual) do |typ,size,clk,rst,br_rsts = {}|
339
339
  # using +target+ as target of access result.
340
340
  reader do |blk,target|
341
341
  # By default the read trigger is 0.
342
- top_block.unshift { trig_r <= 0 }
343
- # The read procedure.
344
342
  rst = send(rst_name)
343
+ top_block.unshift do
344
+ # Initialize the address so that the next access is at address 0.
345
+ hif(rst==1) { abus_r <= -1 }
346
+ # Reset so switch of the access trigger.
347
+ trig_r <= 0
348
+ end
349
+ # The read procedure.
345
350
  par do
346
351
  hif(rst == 0) do
347
352
  # No reset, so can perform the read.
@@ -354,10 +359,6 @@ HDLRuby::High::Std.channel(:mem_dual) do |typ,size,clk,rst,br_rsts = {}|
354
359
  abus_r <= abus_r + 1
355
360
  trig_r <= 1
356
361
  end
357
- helse do
358
- # Initialize the address to -1
359
- abus_r <= -1
360
- end
361
362
  end
362
363
  end
363
364
  end
@@ -378,24 +379,26 @@ HDLRuby::High::Std.channel(:mem_dual) do |typ,size,clk,rst,br_rsts = {}|
378
379
  # using +target+ as target of access result.
379
380
  writer do |blk,target|
380
381
  # By default the read trigger is 0.
381
- top_block.unshift { trig_w <= 0 }
382
- # The write procedure.
383
382
  rst = send(rst_name)
383
+ top_block.unshift do
384
+ # Initialize the address so that the next access is at address 0.
385
+ hif(rst == 1) { abus_w <= -1 }
386
+ # Reset so switch of the access trigger.
387
+ trig_w <= 0
388
+ end
389
+ # The write procedure.
384
390
  par do
385
391
  hif(rst == 0) do
386
392
  # No reset, so can perform the write.
387
393
  hif(trig_w == 1) do
388
394
  # The trigger was previously set, write ok.
389
- blk.call if blk
390
- end
395
+ blk.call
396
+ end if blk
391
397
  # Prepare the write.
392
398
  abus_w <= abus_w + 1
393
399
  trig_w <= 1
394
400
  dbus_w <= target
395
401
  end
396
- helse do
397
- abus_w <= -1
398
- end
399
402
  end
400
403
  end
401
404
  end
@@ -273,20 +273,23 @@ begin
273
273
  if systemI1Statements.size != 4 then
274
274
  puts "Error: invalid number of statements, got #{systemI1Statements.size} but expecting 4."
275
275
  success = false
276
- elsif !systemI1Statements[0].is_a?(Transmit) then
277
- puts "Error: invalid first statement, got #{systemI1Statements[0].class} but expecting Transmit."
276
+ elsif !systemI1Statements[0].is_a?(If) then
277
+ puts "Error: invalid first statement, got #{systemI1Statements[0].class} but expecting If."
278
278
  success = false
279
- elsif systemI1Statements[0].left.object.name != :o1 then
280
- puts "Error: invalid first statement left, got #{systemI1Statements[0].left.object.name} but expecting o1."
279
+ elsif !systemI1Statements[0].yes.last_statement.is_a?(Transmit) then
280
+ puts "Error: invalid content of first if statement, got #{systemI1Statements[0].yes.class} but expecting Transmit."
281
281
  success = false
282
- elsif systemI1Statements[0].right.operator != :* then
283
- puts "Error: invalid first statement right operator, got #{systemI1Statements[0].right.operator} but expecting *."
282
+ elsif systemI1Statements[0].yes.last_statement.left.object.name != :o1 then
283
+ puts "Error: invalid content of first if statement left, got #{systemI1Statements[0].left.object.name} but expecting o1."
284
284
  success = false
285
- elsif systemI1Statements[0].right.left.object.name != :i0 then
286
- puts "Error: invalid first statement right left, got #{systemI1Statements[0].right.left.object.name} but expecting i0."
285
+ elsif systemI1Statements[0].yes.last_statement.right.operator != :* then
286
+ puts "Error: invalid content of first if statement right operator, got #{systemI1Statements[0].right.operator} but expecting *."
287
287
  success = false
288
- elsif systemI1Statements[0].right.right.object.name != :i1 then
289
- puts "Error: invalid first statement right right, got #{systemI1Statements[0].right.left.object.name} but expecting i1."
288
+ elsif systemI1Statements[0].yes.last_statement.right.left.object.name != :i0 then
289
+ puts "Error: invalid content of first first if statement right left, got #{systemI1Statements[0].right.left.object.name} but expecting i0."
290
+ success = false
291
+ elsif systemI1Statements[0].yes.last_statement.right.right.object.name != :i1 then
292
+ puts "Error: invalid content of first if statement right right, got #{systemI1Statements[0].right.left.object.name} but expecting i1."
290
293
  success = false
291
294
  elsif !systemI1Statements[2].is_a?(If) then
292
295
  puts "Error: invalid third statement, got #{systemI1Statements[2].class} but expecting If."
@@ -1,3 +1,3 @@
1
1
  module HDLRuby
2
- VERSION = "2.2.3"
2
+ VERSION = "2.2.5"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: HDLRuby
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.3
4
+ version: 2.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lovic Gauthier
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-03-10 00:00:00.000000000 Z
11
+ date: 2020-03-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler