Skip to content

Commit 09f1cec

Browse files
committed
Solved issue with std_logic_ports translation
Managed the issues associated with interface arrays.
1 parent 9bb27ee commit 09f1cec

File tree

2 files changed

+55
-14
lines changed

2 files changed

+55
-14
lines changed

myhdl/conversion/_toVHDL.py

Lines changed: 49 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -516,11 +516,19 @@ def _revisePorts(self, intf, stdLogicPorts):
516516
ds = s
517517
elif isinstance(s, _MemInfo):
518518
ds = s.elObj
519+
519520
if stdLogicPorts and ds._type in (intbv, bitarray):
520521
final_name = port.name + "_num"
521522
convert_port = port.name
522-
vhd_ports_convert.append(vhd_signal(port.name, port.signal,
523-
port.vhd_type, True))
523+
524+
if isinstance(port.vhd_type, vhd_array):
525+
vhd_obj = vhd_array(s.depth, vhd_vector(port.vhd_type.type.size))
526+
vhd_ports_convert.append(vhd_signal(port.name, port.signal,
527+
port.vhd_type, True))
528+
else:
529+
vhd_ports_convert.append(vhd_signal(port.name, port.signal,
530+
port.vhd_type, True))
531+
524532
for sl in ds._slicesigs:
525533
sl._setName('VHDL')
526534
else:
@@ -1443,7 +1451,10 @@ def _writePort(f, port, entity=True):
14431451
if isinstance(port.vhd_type, (vhd_array, vhd_enum)):
14441452
for sl in port.signal.elObj._slicesigs:
14451453
sl._setName('VHDL')
1446-
port_type = "std_logic_vector"
1454+
if isinstance(port.vhd_type.type, vhd_vector):
1455+
port_type = vhd_array(port.vhd_type.high+1, vhd_vector(port.vhd_type.type.size)).toStr(False)
1456+
else:
1457+
port_type = "std_logic_vector"
14471458
else:
14481459
for sl in port.signal._slicesigs:
14491460
sl._setName('VHDL')
@@ -1462,15 +1473,22 @@ def _writePort(f, port, entity=True):
14621473
if port.convert and entity:
14631474
port_conversions = port.entity.architecture.signal_conversions
14641475
if port.direction in ("inout", "out"):
1465-
port_conversions.append(vhd_assign(port.name,
1466-
"%s(%s)" % ("std_logic_vector",
1467-
port.convert)))
1476+
if isinstance(port.vhd_type, vhd_array):
1477+
for idx in range(port.vhd_type.high+1):
1478+
port_conversions.append(vhd_assign(f"{port.name:s}({idx:d})",
1479+
f"std_logic_vector({port.convert}({idx}))"))
1480+
else:
1481+
port_conversions.append(vhd_assign(port.name,
1482+
f"std_logic_vector({port.convert})"))
14681483
port.signal._read = True
14691484
else:
1470-
port_conversions.append(vhd_assign(port.convert,
1471-
"%s(%s)" %
1472-
(port.vhd_type.toStr(False),
1473-
port.name)))
1485+
if isinstance(port.vhd_type, vhd_array):
1486+
for idx in range(port.vhd_type.high+1):
1487+
port_conversions.append(vhd_assign(port.convert,
1488+
f"{port.vhd_type.toStr(False)}({port.name}({idx}))"))
1489+
else:
1490+
port_conversions.append(vhd_assign(port.convert,
1491+
f"{port.vhd_type.toStr(False)}({port.name})"))
14741492
port.signal._driven = "reg"
14751493

14761494

@@ -1603,22 +1621,34 @@ def _writeCompUnits(f, entity):
16031621
f.write(" port map (")
16041622
c = ''
16051623
for port_name in component.entity.ports_list:
1606-
f.write(c)
1607-
c = ",\n "
16081624
port = component.entity.ports_dict[port_name]
16091625
convert = component.entity.ports_dict[port_name].convert
16101626
if convert:
16111627
port_name = port.name
16121628
name = component.ports_signals_dict[port_name]
16131629
if convert and isinstance(port.vhd_type, (vhd_unsigned, vhd_signed, vhd_sfixed)):
1630+
f.write(c)
16141631
if port.direction == "out":
16151632
f.write("%s(%s) => %s" % (port.vhd_type.toStr(False), port_name, name))
16161633
elif port.direction == "in":
16171634
f.write("%s => std_logic_vector(%s)" % (port_name, name))
16181635
else:
16191636
f.write("%s(%s) => std_logic_vector(%s)" % (port.vhd_type.toStr(False), port_name, name))
1637+
elif convert and isinstance(port.vhd_type, vhd_array):
1638+
for idx in range(port.vhd_type.high + 1):
1639+
f.write(c)
1640+
if port.direction == "out":
1641+
f.write(
1642+
"%s(%s(%d)) => %s(%d)" % (port.vhd_type.type.toStr(False), port_name, idx, name, idx))
1643+
elif port.direction == "in":
1644+
f.write("%s(%d) => std_logic_vector(%s(%d))" % (port_name, idx, name, idx))
1645+
else:
1646+
f.write("%s(%s(%d)) => std_logic_vector(%s(%d))" % (
1647+
port.vhd_type.type.toStr(False), port_name, idx, name, idx))
16201648
else:
1649+
f.write(c)
16211650
f.write("%s => %s" % (port_name, name))
1651+
c = ",\n "
16221652
f.write("\n );\n")
16231653
f.write('\n')
16241654

@@ -3683,7 +3713,13 @@ def __inv__(self):
36833713
class vhd_vector(vhd_type):
36843714
def __init__(self, size=0):
36853715
vhd_type.__init__(self, size)
3686-
self._name = 'vector_%s' % size
3716+
self._name = 'std_logic_vector_%s' % size
3717+
3718+
def toStr(self, constr=True):
3719+
if constr:
3720+
return "std_logic_vector(%s downto 0)" % (self.size - 1)
3721+
else:
3722+
return "std_logic_vector"
36873723

36883724
def _logical(self, other):
36893725
if isinstance(other, vhd_int):

myhdl/test/conversion/toVHDL/test_interfaces5.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,9 +146,14 @@ def test_five_analyze():
146146
analyze(m_top, clock, reset, intf1, intf2, intf3)
147147

148148

149-
def test_five_verify():
149+
def test_five_verify_std_logic():
150+
toVHDL.std_logic_ports = True
150151
assert verify(c_testbench_five) == 0
152+
toVHDL.std_logic_ports = False
151153

154+
def test_five_verify():
155+
toVHDL.std_logic_ports = False
156+
assert verify(c_testbench_five) == 0
152157

153158
def test_conversion():
154159
toVHDL(c_testbench_five)

0 commit comments

Comments
 (0)