HDLRuby 2.4.27 → 2.4.28

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