@@ -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):
36833713class 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 ):
0 commit comments