HDLRuby 2.4.27 → 2.4.28

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: 68d4b96d98a37f1398d44249498d5bb82e977776d5f3e28a930de98ed8ab5ece
4
- data.tar.gz: 6a7c8b57cf47d42f541b04c34765c5b05e08d93a64eaa66e1ca2048b461682a5
3
+ metadata.gz: ad6c03f726ed838a4d5456f41c4b0f295e4ca7d10ca8585ee8f8c011f7f2fd23
4
+ data.tar.gz: a59727e177be4d5ff3eb740d210fad37bd4ba9ea6296a8cfed84495a7122411d
5
5
  SHA512:
6
- metadata.gz: 8c5fd477685906abd21772655ccd1e9c40efdb4069bae0ffbadc9206dc0ea2df2110e983ae08875feec18c1d8e26937e8574aa596c07b946ec9e6ed1ed83714e
7
- data.tar.gz: 6a7fd8f88a307d13d100a63fc774ac70452dae9fc444642ceb038dd3b50ad98eb0318b422412dc4efc77ae858d29ff58c0e66b0c5179806cb0b16854b9ff1cef
6
+ metadata.gz: dc19bcb5b44267c6506a9a1b3547d516b565a2a3ea997bf2ab5cada119caafb0fee09220c7da2e92321562ed2588dc5b6c58c6c697d3230daa8942c00fb731f6
7
+ data.tar.gz: c6849492302732600fe232d73f6984c4fe1a94e4d818349d5400fb15979eecc6b2b32d71a81b50f09713c5143236e13f330f763ea98beeda4a939d77b8d2fba9
@@ -0,0 +1,59 @@
1
+ # require "../hruby_low2c.rb"
2
+
3
+
4
+
5
+ # A system for testing the execution of par block in seq block.
6
+ system :seqpar_bench do
7
+
8
+ inner :rst, :clk
9
+ signed[8].inner :a, :b, :c, :d
10
+ signed[8].inner :out
11
+
12
+ seq(clk.posedge) do
13
+ hif(rst) do
14
+ a <= 0
15
+ b <= 0
16
+ c <= 0
17
+ d <= 0
18
+ end
19
+ helse do
20
+ a <= a + 1
21
+ b <= a + 2
22
+ par do
23
+ c <= b + 3
24
+ d <= c + 4
25
+ end
26
+ a <= d + 5
27
+ end
28
+ end
29
+
30
+ out <= a
31
+
32
+ timed do
33
+ clk <= 0
34
+ rst <= 0
35
+ !20.ns
36
+ clk <= 1
37
+ !20.ns
38
+ clk <= 0
39
+ rst <= 1
40
+ !20.ns
41
+ clk <= 1
42
+ !20.ns
43
+ clk <= 0
44
+ rst <= 0
45
+ !20.ns
46
+ clk <= 1
47
+ !20.ns
48
+ clk <= 0
49
+ !20.ns
50
+ clk <= 1
51
+ !20.ns
52
+ clk <= 0
53
+ !20.ns
54
+ clk <= 1
55
+ !20.ns
56
+ clk <= 0
57
+ !20.ns
58
+ end
59
+ end
@@ -20,6 +20,7 @@ require 'HDLRuby/hruby_low_with_var'
20
20
  require 'HDLRuby/hruby_low_without_concat'
21
21
  require 'HDLRuby/hruby_low_without_connection'
22
22
  require 'HDLRuby/hruby_low_casts_without_expression'
23
+ require 'hruby_low_without_parinseq'
23
24
  require 'HDLRuby/hruby_low_cleanup'
24
25
 
25
26
  require 'HDLRuby/hruby_verilog.rb'
@@ -583,6 +584,7 @@ elsif $options[:verilog] then
583
584
  systemT.to_global_systemTs!
584
585
  # systemT.break_types!
585
586
  # systemT.expand_types!
587
+ systemT.par_in_seq2seq!
586
588
  systemT.initial_concat_to_timed!
587
589
  systemT.with_port!
588
590
  end
@@ -0,0 +1,151 @@
1
+ require 'HDLRuby'
2
+ require 'HDLRuby/hruby_tools'
3
+ require 'HDLRuby/hruby_low_mutable'
4
+
5
+
6
+ module HDLRuby::Low
7
+
8
+
9
+ ##
10
+ # Converts par blocks within seq blocks to seq blocks.
11
+ # For matching the executing model of Verilog.
12
+ #
13
+ ########################################################################
14
+
15
+
16
+ ## Extends the SystemT class with functionality for converting par blocks
17
+ # within seq blocks to seq blocks.
18
+ class SystemT
19
+
20
+ # Converts par blocks within seq blocks to seq blocks.
21
+ def par_in_seq2seq!
22
+ self.scope.par_in_seq2seq!
23
+ end
24
+ end
25
+
26
+ ## Extends the Scope class with functionality for breaking assingments
27
+ # to concats.
28
+ class Scope
29
+ # Converts par blocks within seq blocks to seq blocks.
30
+ def par_in_seq2seq!
31
+ # Recruse on the sub scopes.
32
+ self.each_scope(&:par_in_seq2seq!)
33
+ # Recurse on the block.
34
+ self.each_behavior do |behavior|
35
+ behavior.block.par_in_seq2seq!
36
+ end
37
+ end
38
+ end
39
+
40
+
41
+ ## Extends the Statement class with functionality for breaking assingments
42
+ # to concats.
43
+ class Statement
44
+ # Converts par blocks within seq blocks to seq blocks.
45
+ def par_in_seq2seq!
46
+ # By default nothing to do.
47
+ return self
48
+ end
49
+
50
+ # Convert the block to seq.
51
+ def to_seq!
52
+ # By default nothing to do.
53
+ return self
54
+ end
55
+ end
56
+
57
+
58
+ ## Extends the If class with functionality for breaking assingments
59
+ # to concats.
60
+ class If
61
+ # Converts par blocks within seq blocks to seq blocks.
62
+ def par_in_seq2seq!
63
+ self.yes.par_in_seq2seq!
64
+ self.each_noif do |cond,blk|
65
+ blk.par_in_seq2seq!
66
+ end
67
+ self.no.par_in_seq2seq! if self.no
68
+ end
69
+
70
+ # Convert the block to seq.
71
+ def to_seq!
72
+ self.to_seq!
73
+ self.each_noif do |cond,blk|
74
+ blk.to_seq!
75
+ end
76
+ self.no.to_seq! if self.no
77
+ end
78
+ end
79
+
80
+
81
+ ## Extends the Case class with functionality for breaking assingments
82
+ # to concats.
83
+ class Case
84
+ # Converts par blocks within seq blocks to seq blocks.
85
+ def par_in_seq2seq!
86
+ self.each_when do |w|
87
+ w.statement.par_in_seq2seq!
88
+ end
89
+ self.default.par_in_seq2seq! if self.default
90
+ end
91
+
92
+ # Convert the block to seq.
93
+ def to_seq!
94
+ self.each_when do |w|
95
+ w.statement.to_seq!
96
+ end
97
+ self.default.to_seq! if self.default
98
+ end
99
+ end
100
+
101
+
102
+ ## Extends the Block class with functionality for breaking assingments
103
+ # to concats.
104
+ class Block
105
+ # Converts par blocks within seq blocks to seq blocks.
106
+ def par_in_seq2seq!
107
+ # Recurse on the sub blocks.
108
+ self.each_statement(&:par_in_seq2seq!)
109
+ # Is the current block a seq block?
110
+ if self.mode == :seq then
111
+ # Yes, convert its inner par blocks to seq blocks.
112
+ self.each_statement do |statement|
113
+ if (statement.is_a?(Block)) then
114
+ statement.to_seq! if statement.mode == :par
115
+ end
116
+ end
117
+ end
118
+ return self
119
+ end
120
+
121
+ # Convert the block to seq.
122
+ def to_seq!
123
+ if self.mode == :par then
124
+ # Need to convert.
125
+ # First recurse on the sub blocks.
126
+ self.each_statement(&:to_seq!)
127
+ # Now replace each left value by a new signal for
128
+ # differed assingment in seq.
129
+ differeds = []
130
+ self.each_statement do |statement|
131
+ left = statement.left
132
+ if statement.is_a?(Transmit) then
133
+ sig = SignalI.new(HDLRuby.uniq_name,left.type)
134
+ self.add_inner(sig)
135
+ diff = RefName.new(left.type,RefThis.new,sig.name)
136
+ differeds << [left,diff]
137
+ statement.set_left!(diff)
138
+ end
139
+ end
140
+ # Adds the differed assignments.
141
+ differeds.each do |left,diff|
142
+ self.add_statement(Transmit.new(left.clone,diff.clone))
143
+ end
144
+ # Change the mode.
145
+ self.set_mode!(:seq)
146
+ end
147
+ return self
148
+ end
149
+ end
150
+
151
+ end
@@ -14,6 +14,9 @@ module HDLRuby::Low
14
14
  # The list of base types used both in verilog and HDLRuby
15
15
  VERILOG_BASE_TYPES = ["signed"]
16
16
 
17
+ # The list of signals that are actually verilog regs.
18
+ VERILOG_REGS = []
19
+
17
20
 
18
21
  # Sample of very handy for programming.
19
22
  # puts "class=#{self.yes.class}" # Confirm class of self.yes.
@@ -25,7 +28,7 @@ module HDLRuby::Low
25
28
  # end
26
29
 
27
30
  # Global variable used for indentation and structure (temporary).
28
- $space_count = 0 # Count used for increasing indent by if statement. (temporary)
31
+ # $space_count = 0 # Count used for increasing indent by if statement. (temporary)
29
32
  $vector_reg = "" # For storing signal type at structure declaration. (temporary)
30
33
  $vector_cnt = 0 # For allocating numbers at structure declaration. (temporary)
31
34
 
@@ -101,9 +104,11 @@ end
101
104
  # Enhance Transmit with generation of verilog code.
102
105
  class Transmit
103
106
  # Converts the system to Verilog code.
104
- def to_verilog(mode = nil)
107
+ # def to_verilog(mode = nil)
108
+ def to_verilog(spc = 3)
105
109
  # Determine blocking assignment or nonblocking substitution from mode and return it.
106
- code = "#{self.left.to_verilog} #{mode == "seq" ? "=" : "<="} #{self.right.to_verilog};\n"
110
+ # code = "#{self.left.to_verilog} #{mode == "seq" ? "=" : "<="} #{self.right.to_verilog};\n"
111
+ code = "#{" " * spc}#{self.left.to_verilog} #{self.block.mode == :seq ? "=" : "<="} #{self.right.to_verilog};"
107
112
  return code
108
113
  end
109
114
  end
@@ -111,12 +116,68 @@ end
111
116
  # To scheduling to the Block.
112
117
  # Enhance Block with generation of verilog code.
113
118
  class Block
114
- # Converts the system to Verilog code.
115
- def to_verilog(mode = nil)
116
- # No translation is done in this class.
117
- puts "Block to_verilog not found" # For debugging
119
+ # # Converts the system to Verilog code.
120
+ # def to_verilog(mode = nil)
121
+ # # No translation is done in this class.
122
+ # puts "Block to_verilog not found" # For debugging
123
+ # end
124
+
125
+ # Converts the system to Verilog code adding 'spc' spaces at the begining
126
+ # of each line.
127
+ def to_verilog(spc = 3)
128
+ code = "begin"
129
+ code << " : #{name_to_verilog(self.name)}" if self.name && !self.name.empty?
130
+ code << "\n" if block.each_inner.any?
131
+ # Declaration of "inner" part within "always".
132
+ block.each_inner do |inner|
133
+ # if regs.include?(inner.name) then
134
+ if HDLRuby::Low::VERILOG_REGS.include?(inner.to_verilog) then
135
+ # code << " reg"
136
+ code << "#{" " * (spc+3)}reg"
137
+ else
138
+ code << "#{" " * (spc+3)}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(behavior.block.mode.to_s)}"
165
+ # code << "\n#{" "*spc}#{statement.to_verilog(behavior.block.mode.to_s)}"
166
+ if statement.is_a?(Block) then
167
+ code << "\n#{" " * (spc+3)}#{statement.to_verilog(spc+3)}"
168
+ else
169
+ code << "\n#{statement.to_verilog(spc+3)}"
170
+ end
171
+ end
172
+ # Close the block."
173
+ code << "\n#{" "*spc}end"
174
+ return code
118
175
  end
119
176
 
177
+
178
+
179
+
180
+
120
181
  # Extract and convert to verilog the TimeRepeat statements.
121
182
  # NOTE: work only on the current level of the block (should be called
122
183
  # through each_block_deep).
@@ -136,7 +197,7 @@ class Block
136
197
  # Declaration of "inner" part within "always".
137
198
  block.each_inner do |inner|
138
199
  # if regs.include?(inner.name) then
139
- if regs.include?(inner.to_verilog) then
200
+ if HDLRuby::Low::VERILOG_REGS.include?(inner.to_verilog) then
140
201
  code << " reg"
141
202
  else
142
203
  code << " wire"
@@ -1431,66 +1492,82 @@ class Value
1431
1492
  end
1432
1493
  end
1433
1494
 
1495
+
1434
1496
  # Used to transrate if.
1435
1497
  # Enhance If with generation of verilog code.
1436
1498
  class If
1437
- # Converts the system to Verilog code.
1438
- def to_verilog(mode = nil)
1499
+ # # Converts the system to Verilog code.
1500
+ # def to_verilog(mode = nil)
1501
+ # Converts to Verilog code, checking adding 'spc' spaces at the begining
1502
+ # of each line.
1503
+ def to_verilog(spc = 3)
1439
1504
 
1440
1505
  $blocking = false
1441
1506
 
1442
- if ($space_count == 0) then
1443
- result = " " * ($space_count) # Indented based on space_count.
1444
- else
1445
- result = ""
1446
- end
1447
- $space_count += 1 # Add count to be used for indentation.
1507
+ # if ($space_count == 0) then
1508
+ # result = " " * ($space_count) # Indented based on space_count.
1509
+ # else
1510
+ # result = ""
1511
+ # end
1512
+ # $space_count += 1 # Add count to be used for indentation.
1513
+ result = " " * spc # Indented based on space_count.
1448
1514
 
1449
- result << "if (#{self.condition.to_verilog}) begin\n"
1515
+ # result << "if (#{self.condition.to_verilog}) begin\n"
1516
+ result << "if (#{self.condition.to_verilog}) "
1450
1517
 
1451
1518
 
1452
1519
  # Check if there is yes (if) and output yes or less.
1453
1520
  if self.respond_to? (:yes)
1454
- self.yes.each_statement do |statement|
1455
- result << "#{" " * $space_count} #{statement.to_verilog(mode)}"
1456
- end
1457
- result << "#{" " * $space_count} end\n"
1521
+ # self.yes.each_statement do |statement|
1522
+ # result << "#{" " * $space_count} #{statement.to_verilog(mode)}"
1523
+ # end
1524
+ # result << "#{" " * $space_count} end\n"
1525
+ result << self.yes.to_verilog(spc)
1458
1526
  end
1459
1527
 
1460
1528
  # If noif (else if) exists, it outputs it.
1461
1529
  # Since noif is directly under, respond_to is unnecessary.
1462
1530
  self.each_noif do |condition, block|
1463
- result << "#{" " * $space_count} else if (#{condition.to_verilog}) begin\n"
1464
- block.each_statement do |statement|
1465
- result << "#{" " * $space_count} #{statement.to_verilog(mode)}"
1466
- end
1467
- result << "#{" "* $space_count} end\n"
1531
+ # result << "#{" " * $space_count} else if (#{condition.to_verilog}) begin\n"
1532
+ result << "\n#{" "*spc}else if (#{condition.to_verilog}) "
1533
+ # block.each_statement do |statement|
1534
+ # result << "#{" " * $space_count} #{statement.to_verilog(mode)}"
1535
+ # end
1536
+ # result << "#{" "* $space_count} end\n"
1537
+ result << block.to_verilog(spc)
1468
1538
  end
1469
1539
 
1470
1540
  # Check if there is no (else) and output no or less.
1471
- if self.no.respond_to? (:mode)
1472
- result << "#{" " * $space_count} else begin\n"
1473
- self.no.each_statement do |statement|
1474
- result << "#{" " * $space_count} #{statement.to_verilog(mode)}"
1475
- end
1476
- result << "#{" " * $space_count} end\n"
1541
+ if self.no.respond_to?(:mode)
1542
+ # result << "#{" " * $space_count} else begin\n"
1543
+ result << "\n#{" " * spc}else "
1544
+ # self.no.each_statement do |statement|
1545
+ # result << "#{" " * $space_count} #{statement.to_verilog(mode)}"
1546
+ # end
1547
+ # result << "#{" " * $space_count} end\n"
1548
+ result << self.no.to_verilog(spc)
1477
1549
  end
1478
1550
 
1479
- $space_count -= 1 # Since the output ends, reduce the count.
1551
+ # $space_count -= 1 # Since the output ends, reduce the count.
1480
1552
  return result
1481
1553
  end
1482
1554
  end
1483
1555
 
1484
1556
  # Used to translate case
1485
1557
  class Case
1486
- def to_verilog(mode = nil)
1558
+ # def to_verilog(mode = nil)
1559
+ #
1560
+ # Converts to Verilog code, checking if variables are register
1561
+ # or wire adding 'spc' spaces at the begining of each line.
1562
+ def to_verilog(spc = 3)
1487
1563
 
1488
- if ($space_count == 0) then
1489
- result = " " * ($space_count) # Indented based on space_count.
1490
- else
1491
- result = ""
1492
- end
1493
- $space_count += 1 # Add count to be used for indentation.
1564
+ # if ($space_count == 0) then
1565
+ # result = " " * ($space_count) # Indented based on space_count.
1566
+ # else
1567
+ # result = ""
1568
+ # end
1569
+ # $space_count += 1 # Add count to be used for indentation.
1570
+ result = " " * spc # Indented based on space_count.
1494
1571
 
1495
1572
  result = ""
1496
1573
  result << "case(#{self.value.to_verilog})\n"
@@ -1498,40 +1575,55 @@ class Case
1498
1575
  # n the case statement, each branch is partitioned by when. Process each time when.
1499
1576
  self.each_when do |whens|
1500
1577
  # Reads and stores the numbers and expressions stored in when.
1501
- result << " " + " " *$space_count + "#{whens.match.to_verilog}: "
1502
- if whens.statement.each_statement.count > 1 then
1503
- result << "begin\n"
1504
- whens.statement.each_statement do |statement|
1505
- result << " "+ " " *$space_count +"#{statement.to_verilog}"
1506
- end
1507
- result << " " + " " *$space_count + "end\n"
1508
- elsif whens.statement.each_statement.count == 1 then
1509
- whens.statement.each_statement do |statement|
1510
- result << "#{statement.to_verilog}"
1511
- end
1578
+ # result << " " + " " *$space_count + "#{whens.match.to_verilog}: "
1579
+ result << " " * (spc+3) + "#{whens.match.to_verilog}: "
1580
+
1581
+ # if whens.statement.each_statement.count > 1 then
1582
+ # result << "begin\n"
1583
+ # whens.statement.each_statement do |statement|
1584
+ # result << " "+ " " *$space_count +"#{statement.to_verilog}"
1585
+ # end
1586
+ # result << " " + " " *$space_count + "end\n"
1587
+ # elsif whens.statement.each_statement.count == 1 then
1588
+ # whens.statement.each_statement do |statement|
1589
+ # result << "#{statement.to_verilog}"
1590
+ # end
1591
+ # else
1592
+ # # Empty statement case.
1593
+ # result << "\n"
1594
+ # end
1595
+ if whens.statement.each_statement.count >= 1 then
1596
+ result << whens.statement.to_verilog(spc+3)
1512
1597
  else
1513
- # Empty statement case.
1514
1598
  result << "\n"
1515
1599
  end
1516
1600
  end
1517
- # The default part is stored in default instead of when. Reads and processes in the same way as when.
1601
+ # # The default part is stored in default instead of when. Reads and processes in the same way as when.
1602
+ # if self.default then
1603
+ # if self.default.each_statement.count > 1 then
1604
+ # result << " " + " " *$space_count + "default: begin\n"
1605
+ # self.default.each_statement do |statement|
1606
+ # result << " " + " " *$space_count + "#{statement.to_verilog}"
1607
+ # end
1608
+ # result << " end\n"
1609
+ # elsif self.default.each_statement.count == 1 then
1610
+ # result << " " + " " *$space_count + "default: "
1611
+ # self.default.each_statement do |statement|
1612
+ # result << "#{statement.to_verilog}"
1613
+ # end
1614
+ # end
1615
+ # end
1518
1616
  if self.default then
1519
- if self.default.each_statement.count > 1 then
1520
- result << " " + " " *$space_count + "default: begin\n"
1521
- self.default.each_statement do |statement|
1522
- result << " " + " " *$space_count + "#{statement.to_verilog}"
1523
- end
1524
- result << " end\n"
1525
- elsif self.default.each_statement.count == 1 then
1526
- result << " " + " " *$space_count + "default: "
1527
- self.default.each_statement do |statement|
1528
- result << "#{statement.to_verilog}"
1529
- end
1530
- end
1617
+ if self.default.each_statement.count >= 1 then
1618
+ result << self.default.each_statement.to_verilog(spc+3)
1619
+ else
1620
+ result << "\n"
1621
+ end
1531
1622
  end
1532
- result << " " + " " *$space_count + "endcase\n" # Conclusion.
1623
+ # result << " " + " " *$space_count + "endcase\n" # Conclusion.
1624
+ result << " " * spc + "endcase\n" # Conclusion.
1533
1625
 
1534
- $space_count -= 1 # Since the output ends, reduce the count.
1626
+ # $space_count -= 1 # Since the output ends, reduce the count.
1535
1627
  return result # Return case after translation.
1536
1628
  end
1537
1629
  end
@@ -1697,8 +1789,9 @@ end
1697
1789
  # Look at the unit of time, convert the time to ps and output it.
1698
1790
  # One of two people, TimeWait and Delay.
1699
1791
  class TimeWait
1700
- def to_verilog(mode=nil)
1701
- return self.delay.to_verilog + "\n"
1792
+ # def to_verilog(mode=nil)
1793
+ def to_verilog(spc = 3)
1794
+ return (" " * spc) + self.delay.to_verilog + "\n"
1702
1795
  end
1703
1796
  end
1704
1797
  class Delay
@@ -1776,15 +1869,9 @@ class SystemT
1776
1869
 
1777
1870
  # Converts the system to Verilog code.
1778
1871
  def to_verilog
1779
- # Preprocessing
1780
- # Force seq block to par: ULTRA TEMPORARY! ICIICI
1781
- self.each_behavior do |behavior|
1782
- behavior.each_block_deep do |block|
1783
- block.set_mode!(:par) unless block.is_a?(TimeBlock)
1784
- end
1785
- end
1786
1872
  # Detect the registers
1787
- regs = []
1873
+ # regs = []
1874
+ HDLRuby::Low::VERILOG_REGS.clear
1788
1875
  # The left values.
1789
1876
  self.each_behavior do |behavior|
1790
1877
  # behavior.block.each_statement do |statement|
@@ -1792,7 +1879,9 @@ class SystemT
1792
1879
  # end
1793
1880
  behavior.each_block_deep do |block|
1794
1881
  block.each_statement do |statement|
1795
- regs << statement.left.to_verilog if statement.is_a?(Transmit)
1882
+ if statement.is_a?(Transmit)
1883
+ HDLRuby::Low::VERILOG_REGS << statement.left.to_verilog
1884
+ end
1796
1885
  end
1797
1886
  end
1798
1887
  end
@@ -1809,19 +1898,27 @@ class SystemT
1809
1898
  # # puts "Now regs has clk?: #{regs.include?("clk")}"
1810
1899
  # And the initialized signals.
1811
1900
  self.each_output do |output|
1812
- regs << output.to_verilog if output.value
1901
+ # regs << output.to_verilog if output.value
1902
+ HDLRuby::Low::VERILOG_REGS << output.to_verilog if output.value
1813
1903
  end
1814
1904
  self.each_inner do |inner|
1815
- regs << inner.to_verilog if inner.value
1905
+ # regs << inner.to_verilog if inner.value
1906
+ HDLRuby::Low::VERILOG_REGS << inner.to_verilog if inner.value
1816
1907
  end
1817
1908
  # And the array types signals.
1818
1909
  self.each_signal do |sig|
1819
- # regs << sig.to_verilog if sig.type.is_a?(TypeVector) && sig.type.base.is_a?(TypeVector)
1820
- regs << sig.to_verilog if sig.type.vector? && sig.type.base.vector?
1910
+ # # regs << sig.to_verilog if sig.type.is_a?(TypeVector) && sig.type.base.is_a?(TypeVector)
1911
+ # regs << sig.to_verilog if sig.type.vector? && sig.type.base.vector?
1912
+ if sig.type.vector? && sig.type.base.vector? then
1913
+ HDLRuby::Low::VERILOG_REGS << sig.to_verilog
1914
+ end
1821
1915
  end
1822
1916
  self.each_inner do |sig|
1823
- # regs << sig.to_verilog if sig.type.is_a?(TypeVector) && sig.type.base.is_a?(TypeVector)
1824
- regs << sig.to_verilog if sig.type.vector? && sig.type.base.vector?
1917
+ # # regs << sig.to_verilog if sig.type.is_a?(TypeVector) && sig.type.base.is_a?(TypeVector)
1918
+ # regs << sig.to_verilog if sig.type.vector? && sig.type.base.vector?
1919
+ if sig.type.vector? && sig.type.base.vector? then
1920
+ HDLRuby::Low::VERILOG_REGS << sig.to_verilog
1921
+ end
1825
1922
  end
1826
1923
 
1827
1924
  # Code generation
@@ -1890,7 +1987,8 @@ class SystemT
1890
1987
  $vector_reg = "#{output.to_verilog}"
1891
1988
  $vector_cnt = 0
1892
1989
  output.type.each_type do |type|
1893
- if regs.include?(type.name) then
1990
+ # if regs.include?(type.name) then
1991
+ if HDLRuby::Low::VERILOG_REGS.include?(type.name) then
1894
1992
  code << " output reg"
1895
1993
  else
1896
1994
  code << " output"
@@ -1906,7 +2004,8 @@ class SystemT
1906
2004
  end
1907
2005
  else
1908
2006
  # if regs.include?(output.name) then
1909
- if regs.include?(output.to_verilog) then
2007
+ # if regs.include?(output.to_verilog) then
2008
+ if HDLRuby::Low::VERILOG_REGS.include?(output.to_verilog) then
1910
2009
  code << " output reg"
1911
2010
  else
1912
2011
  code << " output"
@@ -1937,8 +2036,9 @@ class SystemT
1937
2036
 
1938
2037
  # Declare "inner".
1939
2038
  self.each_inner do |inner|
1940
- # if regs.include?(inner.name) then
1941
- if regs.include?(inner.to_verilog) then
2039
+ # # if regs.include?(inner.name) then
2040
+ # if regs.include?(inner.to_verilog) then
2041
+ if HDLRuby::Low::VERILOG_REGS.include?(inner.to_verilog) then
1942
2042
  code << " reg"
1943
2043
  else
1944
2044
  code << " wire"
@@ -1966,8 +2066,9 @@ class SystemT
1966
2066
  # If there is scope in scope, translate it.
1967
2067
  self.each_scope do |scope|
1968
2068
  scope.each_inner do |inner|
1969
- # if regs.include?(inner.name) then
1970
- if regs.include?(inner.to_verilog) then
2069
+ # # if regs.include?(inner.name) then
2070
+ # if regs.include?(inner.to_verilog) then
2071
+ if HDLRuby::Low::VERILOG_REGS.include?(inner.to_verilog) then
1971
2072
  code << " reg "
1972
2073
  else
1973
2074
  code << " wire "
@@ -2058,7 +2159,8 @@ class SystemT
2058
2159
  code << blk.repeat_to_verilog!
2059
2160
  end
2060
2161
  # And generate an initial block.
2061
- code << " initial begin\n"
2162
+ # code << " initial begin\n"
2163
+ code << " initial "
2062
2164
  else
2063
2165
  # Generate a standard process.
2064
2166
  code << " always @( "
@@ -2083,54 +2185,57 @@ class SystemT
2083
2185
  code << "#{event.last.type.to_s} #{event.last.ref.to_verilog}"
2084
2186
  end
2085
2187
  end
2086
- code << " ) begin\n"
2188
+ # code << " ) begin\n"
2189
+ code << " ) "
2087
2190
  end
2088
2191
 
2089
- # Perform "scheduling" using the method "flatten".
2090
- block = behavior.block.flatten(behavior.block.mode.to_s)
2091
-
2092
- # Declaration of "inner" part within "always".
2093
- block.each_inner do |inner|
2094
- # if regs.include?(inner.name) then
2095
- if regs.include?(inner.to_verilog) then
2096
- code << " reg"
2097
- else
2098
- code << " wire"
2099
- end
2100
-
2101
- # Variable has "base", but if there is width etc, it is not in "base".
2102
- # It is determined by an if.
2103
- if inner.type.base?
2104
- if inner.type.base.base?
2105
- # code << "#{inner.type.base.to_verilog} #{inner.to_verilog} #{inner.type.to_verilog};\n"
2106
- code << "#{inner.type.base.to_verilog} #{inner.to_verilog} #{inner.type.to_verilog}"
2107
- else
2108
- # code << "#{inner.type.to_verilog} #{inner.to_verilog};\n"
2109
- code << "#{inner.type.to_verilog} #{inner.to_verilog}"
2110
- end
2111
- else
2112
- # code << " #{inner.type.to_verilog}#{inner.to_verilog};\n"
2113
- code << " #{inner.type.to_verilog}#{inner.to_verilog}"
2114
- end
2115
- if inner.value then
2116
- # There is an initial value.
2117
- code << " = #{inner.value.to_verilog}"
2118
- end
2119
- code << ";\n"
2120
- end
2192
+ # # Perform "scheduling" using the method "flatten".
2193
+ # block = behavior.block.flatten(behavior.block.mode.to_s)
2194
+ # code << block.to_verilog(regs)
2195
+ code << behavior.block.to_verilog
2196
+
2197
+ # # Declaration of "inner" part within "always".
2198
+ # block.each_inner do |inner|
2199
+ # # if regs.include?(inner.name) then
2200
+ # if regs.include?(inner.to_verilog) then
2201
+ # code << " reg"
2202
+ # else
2203
+ # code << " wire"
2204
+ # end
2205
+
2206
+ # # Variable has "base", but if there is width etc, it is not in "base".
2207
+ # # It is determined by an if.
2208
+ # if inner.type.base?
2209
+ # if inner.type.base.base?
2210
+ # # code << "#{inner.type.base.to_verilog} #{inner.to_verilog} #{inner.type.to_verilog};\n"
2211
+ # code << "#{inner.type.base.to_verilog} #{inner.to_verilog} #{inner.type.to_verilog}"
2212
+ # else
2213
+ # # code << "#{inner.type.to_verilog} #{inner.to_verilog};\n"
2214
+ # code << "#{inner.type.to_verilog} #{inner.to_verilog}"
2215
+ # end
2216
+ # else
2217
+ # # code << " #{inner.type.to_verilog}#{inner.to_verilog};\n"
2218
+ # code << " #{inner.type.to_verilog}#{inner.to_verilog}"
2219
+ # end
2220
+ # if inner.value then
2221
+ # # There is an initial value.
2222
+ # code << " = #{inner.value.to_verilog}"
2223
+ # end
2224
+ # code << ";\n"
2225
+ # end
2121
2226
 
2122
- # Translate the block that finished scheduling.
2123
- block.each_statement do |statement|
2124
- code << "\n #{statement.to_verilog(behavior.block.mode.to_s)}"
2125
- end
2227
+ # # Translate the block that finished scheduling.
2228
+ # block.each_statement do |statement|
2229
+ # code << "\n #{statement.to_verilog(behavior.block.mode.to_s)}"
2230
+ # end
2126
2231
 
2127
- $fm.fm_par.clear()
2232
+ # $fm.fm_par.clear()
2128
2233
 
2129
- code << "\n end\n\n"
2234
+ # code << "\n end\n\n"
2130
2235
  end
2131
2236
 
2132
2237
  # Conclusion.
2133
- code << "endmodule"
2238
+ code << "\nendmodule"
2134
2239
  return code
2135
2240
  end
2136
2241
  end
@@ -1,3 +1,3 @@
1
1
  module HDLRuby
2
- VERSION = "2.4.27"
2
+ VERSION = "2.4.28"
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.4.27
4
+ version: 2.4.28
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lovic Gauthier
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-01-05 00:00:00.000000000 Z
11
+ date: 2021-01-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -116,6 +116,7 @@ files:
116
116
  - lib/HDLRuby/hdr_samples/register_with_code_bench.rb
117
117
  - lib/HDLRuby/hdr_samples/rom.rb
118
118
  - lib/HDLRuby/hdr_samples/ruby_fir_hw.rb
119
+ - lib/HDLRuby/hdr_samples/seqpar_bench.rb
119
120
  - lib/HDLRuby/hdr_samples/struct.rb
120
121
  - lib/HDLRuby/hdr_samples/sumprod.rb
121
122
  - lib/HDLRuby/hdr_samples/sw_encrypt_bench.rb
@@ -221,6 +222,7 @@ files:
221
222
  - lib/HDLRuby/hruby_low_without_connection.rb
222
223
  - lib/HDLRuby/hruby_low_without_namespace.rb
223
224
  - lib/HDLRuby/hruby_low_without_outread.rb
225
+ - lib/HDLRuby/hruby_low_without_parinseq.rb
224
226
  - lib/HDLRuby/hruby_low_without_select.rb
225
227
  - lib/HDLRuby/hruby_serializer.rb
226
228
  - lib/HDLRuby/hruby_tools.rb