@@ -516,11 +516,19 @@ def _revisePorts(self, intf, stdLogicPorts):
516
516
ds = s
517
517
elif isinstance (s , _MemInfo ):
518
518
ds = s .elObj
519
+
519
520
if stdLogicPorts and ds ._type in (intbv , bitarray ):
520
521
final_name = port .name + "_num"
521
522
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
+
524
532
for sl in ds ._slicesigs :
525
533
sl ._setName ('VHDL' )
526
534
else :
@@ -1443,7 +1451,10 @@ def _writePort(f, port, entity=True):
1443
1451
if isinstance (port .vhd_type , (vhd_array , vhd_enum )):
1444
1452
for sl in port .signal .elObj ._slicesigs :
1445
1453
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"
1447
1458
else :
1448
1459
for sl in port .signal ._slicesigs :
1449
1460
sl ._setName ('VHDL' )
@@ -1462,15 +1473,22 @@ def _writePort(f, port, entity=True):
1462
1473
if port .convert and entity :
1463
1474
port_conversions = port .entity .architecture .signal_conversions
1464
1475
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 } )" ))
1468
1483
port .signal ._read = True
1469
1484
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 } )" ))
1474
1492
port .signal ._driven = "reg"
1475
1493
1476
1494
@@ -1603,22 +1621,34 @@ def _writeCompUnits(f, entity):
1603
1621
f .write (" port map (" )
1604
1622
c = ''
1605
1623
for port_name in component .entity .ports_list :
1606
- f .write (c )
1607
- c = ",\n "
1608
1624
port = component .entity .ports_dict [port_name ]
1609
1625
convert = component .entity .ports_dict [port_name ].convert
1610
1626
if convert :
1611
1627
port_name = port .name
1612
1628
name = component .ports_signals_dict [port_name ]
1613
1629
if convert and isinstance (port .vhd_type , (vhd_unsigned , vhd_signed , vhd_sfixed )):
1630
+ f .write (c )
1614
1631
if port .direction == "out" :
1615
1632
f .write ("%s(%s) => %s" % (port .vhd_type .toStr (False ), port_name , name ))
1616
1633
elif port .direction == "in" :
1617
1634
f .write ("%s => std_logic_vector(%s)" % (port_name , name ))
1618
1635
else :
1619
1636
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 ))
1620
1648
else :
1649
+ f .write (c )
1621
1650
f .write ("%s => %s" % (port_name , name ))
1651
+ c = ",\n "
1622
1652
f .write ("\n );\n " )
1623
1653
f .write ('\n ' )
1624
1654
@@ -3683,7 +3713,13 @@ def __inv__(self):
3683
3713
class vhd_vector (vhd_type ):
3684
3714
def __init__ (self , size = 0 ):
3685
3715
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"
3687
3723
3688
3724
def _logical (self , other ):
3689
3725
if isinstance (other , vhd_int ):
0 commit comments