export and simul with standard VHDL
This commit is contained in:
parent
ab008d2ad9
commit
392accdf27
|
@ -54,6 +54,8 @@ from Hurricane import *
|
||||||
|
|
||||||
import re, types, string
|
import re, types, string
|
||||||
|
|
||||||
|
import st_config
|
||||||
|
|
||||||
FRAMEWORK = None
|
FRAMEWORK = None
|
||||||
EDITOR = None
|
EDITOR = None
|
||||||
|
|
||||||
|
@ -87,6 +89,7 @@ class Model :
|
||||||
|
|
||||||
self._name = nom
|
self._name = nom
|
||||||
self._param = param
|
self._param = param
|
||||||
|
self.pat = None
|
||||||
|
|
||||||
self._hur_cell = hurCell
|
self._hur_cell = hurCell
|
||||||
|
|
||||||
|
@ -474,13 +477,16 @@ class Model :
|
||||||
if views == STRATUS :
|
if views == STRATUS :
|
||||||
self.exportStratus ( fileName )
|
self.exportStratus ( fileName )
|
||||||
|
|
||||||
else :
|
elif st_config.format in ['vst','vhd'] :
|
||||||
UpdateSession.open()
|
UpdateSession.open()
|
||||||
|
|
||||||
hurCell = self._hur_cell
|
hurCell = self._hur_cell
|
||||||
|
|
||||||
if str ( hurCell.getName() ) != "__Scratch__" :
|
if str ( hurCell.getName() ) != "__Scratch__" :
|
||||||
FRAMEWORK.saveCell ( hurCell, views|CRL.Catalog.State.Logical )
|
if st_config.format == 'vst' :
|
||||||
|
FRAMEWORK.saveCell ( hurCell, views|CRL.Catalog.State.Logical )
|
||||||
|
else :
|
||||||
|
self.exportVHD()
|
||||||
|
|
||||||
if len ( CELLS ) == 0 :
|
if len ( CELLS ) == 0 :
|
||||||
err = "\n[Stratus ERROR] Save : CELLS stack is empty.\n"
|
err = "\n[Stratus ERROR] Save : CELLS stack is empty.\n"
|
||||||
|
@ -490,15 +496,48 @@ class Model :
|
||||||
|
|
||||||
UpdateSession.close()
|
UpdateSession.close()
|
||||||
|
|
||||||
|
elif st_config.format == 'stratus' :
|
||||||
|
self.exportStratus ( fileName )
|
||||||
|
|
||||||
|
elif st_config.format == 'vlog' :
|
||||||
|
raise Exception('Format %s not yet implemented' % st_config.format)
|
||||||
|
|
||||||
|
else :
|
||||||
|
raise Exception('Unrecognized format %s' % st_config.format)
|
||||||
|
|
||||||
##### Simul : in order to use simulation tool #####
|
##### Simul : in order to use simulation tool #####
|
||||||
def Simul ( self, name = None, tool = 'asimut' ) :
|
def Simul ( self, name = None, tool = 'asimut' ) :
|
||||||
from utils import runpat
|
from utils import runpat
|
||||||
|
|
||||||
if not name : name = self._name
|
if not name : name = self._name
|
||||||
|
|
||||||
if tool == 'asimut' : runpat ( self._name, name, '-l 1 -p 100 -zerodelay -nocheckdriver -nostrict -bdd -nowarning' )
|
if st_config.simulator == 'asimut' :
|
||||||
|
runpat ( self._name, name, '-l 1 -p 100 -zerodelay -nocheckdriver -nostrict -bdd -nowarning' )
|
||||||
|
elif st_config.simulator == 'ghdl' :
|
||||||
|
import os
|
||||||
|
cmd_str = ('ghdl -c -g -Psxlib --ieee=synopsys *.vhd -r %s_run --vcd=%s.vcd' %(name,name))
|
||||||
|
os.system(cmd_str)
|
||||||
|
elif tool == 'asimut' : runpat ( self._name, name, '-l 1 -p 100 -zerodelay -nocheckdriver -nostrict -bdd -nowarning' )
|
||||||
else : raise Exception ( 'not implemented yet' )
|
else : raise Exception ( 'not implemented yet' )
|
||||||
|
|
||||||
|
##### TestBench : in order to create testbench #####
|
||||||
|
def Testbench ( self ) :
|
||||||
|
import stimuli
|
||||||
|
stim = stimuli.Stimuli(self)
|
||||||
|
if st_config.format == 'vhd' :
|
||||||
|
# Create stimuli input file
|
||||||
|
stim.create_stimuli_text_file()
|
||||||
|
|
||||||
|
# Create testbench
|
||||||
|
stim.create_testbench(delay = 20, unit = 'ns', debug = False, downto = True, logic = False)
|
||||||
|
|
||||||
|
# Create testbench and block instance
|
||||||
|
stim.create_run(debug = False, downto = True)
|
||||||
|
elif st_config.format == 'vst' :
|
||||||
|
stim.create_pat_file()
|
||||||
|
else :
|
||||||
|
raise Exception('Testbench not yet implemented for format %s' % st_config.format)
|
||||||
|
|
||||||
##### Create a stratus file given the database #####
|
##### Create a stratus file given the database #####
|
||||||
def exportStratus ( self, fileName ) :
|
def exportStratus ( self, fileName ) :
|
||||||
|
|
||||||
|
@ -708,6 +747,186 @@ class Model :
|
||||||
|
|
||||||
##### End #####
|
##### End #####
|
||||||
file.close ()
|
file.close ()
|
||||||
|
|
||||||
|
##### Create a IEEE VHDL file given the database #####
|
||||||
|
def exportVHD ( self ) :
|
||||||
|
|
||||||
|
file = open ( self._name + '.vhd', "w+" )
|
||||||
|
|
||||||
|
file.write ( "--\n" )
|
||||||
|
file.write ( "-- Generated by VHDL export\n" )
|
||||||
|
file.write ( "--\n" )
|
||||||
|
file.write ( "library ieee;\n" )
|
||||||
|
file.write ( "use ieee.std_logic_1164.all;\n\n" )
|
||||||
|
|
||||||
|
if 'realModel' in self._param :
|
||||||
|
file.write ( "library sxlib;\n" )
|
||||||
|
file.write ( "use sxlib.all;\n\n" )
|
||||||
|
|
||||||
|
|
||||||
|
##### Entity #####
|
||||||
|
file.write ( "entity %s is\n" % self._name )
|
||||||
|
file.write ( " port(\n" )
|
||||||
|
|
||||||
|
strPorts = ""
|
||||||
|
for net in self._st_ports :
|
||||||
|
if net._arity == 1 :
|
||||||
|
strPorts += " %s : %s std_logic;\n" % ( net._name, net._direct )
|
||||||
|
else :
|
||||||
|
strPorts += " %s : %s std_logic_vector(%d downto %d);\n" % ( net._name, net._direct, net._arity-1+net._ind, net._ind )
|
||||||
|
|
||||||
|
for ck in self._st_cks :
|
||||||
|
if ck._ext:
|
||||||
|
strPorts += " %s : IN std_logic;\n" % ( ck._name )
|
||||||
|
|
||||||
|
file.write(strPorts[:-2])
|
||||||
|
file.write ( "\n );\n" )
|
||||||
|
file.write ( "end %s ;\n\n" % self._name )
|
||||||
|
|
||||||
|
##### Architecture #####
|
||||||
|
file.write ( "architecture structural of %s is\n" % self._name )
|
||||||
|
|
||||||
|
|
||||||
|
# Components
|
||||||
|
if 'realModel' in self._param :
|
||||||
|
cellList = [self]
|
||||||
|
else :
|
||||||
|
cellList = self._underCells
|
||||||
|
for cell in cellList :
|
||||||
|
if 'realModel' in self._param :
|
||||||
|
nom = cell._param['realModel']
|
||||||
|
else :
|
||||||
|
nom = cell._name
|
||||||
|
#classe = str(cell.__class__)
|
||||||
|
#nom = cell._name
|
||||||
|
#param = cell._param
|
||||||
|
#print "nom " + nom
|
||||||
|
#print "classe " + classe
|
||||||
|
|
||||||
|
## Gestion of libraries with specific treatment
|
||||||
|
#chaine = re.search ( "(.*)\.([^\.]*)", classe )
|
||||||
|
#if chaine :
|
||||||
|
# fichier = chaine.group(1)
|
||||||
|
# if re.search ( "dpgen_", fichier ) or re.search ( "st_", fichier ) :
|
||||||
|
# classe = chaine.group(2)
|
||||||
|
# # Special treatment for virtual library
|
||||||
|
# if classe == "Bool" :
|
||||||
|
# #nom = cell._name
|
||||||
|
# nom = cell._param['realModel']
|
||||||
|
# classe = cell._param['model']
|
||||||
|
# param = cell._param
|
||||||
|
# #del param['model']
|
||||||
|
# #del param['realModel']
|
||||||
|
|
||||||
|
#classe = string.upper(classe[0]) + classe[1:] #FIXME !!!
|
||||||
|
#if re.search ( "(.*)\.([^\.]*)", classe ) : # ArithLib generator
|
||||||
|
# classe = string.lower(classe[0]) + classe[1:]
|
||||||
|
|
||||||
|
file.write ( " component %s\n" % nom )
|
||||||
|
file.write ( " port(\n" )
|
||||||
|
|
||||||
|
# Ports
|
||||||
|
strPorts = ""
|
||||||
|
for net in cell._st_ports :
|
||||||
|
if net._arity == 1 :
|
||||||
|
strPorts += " %s : %s std_logic;\n" % ( net._name, net._direct )
|
||||||
|
else :
|
||||||
|
strPorts += " %s : %s std_logic_vector(%d downto %d);\n" % ( net._name, net._direct, net._arity-1+net._ind, net._ind )
|
||||||
|
|
||||||
|
for ck in cell._st_cks :
|
||||||
|
if ck._ext:
|
||||||
|
strPorts += " %s : IN std_logic;\n" % ( ck._name )
|
||||||
|
|
||||||
|
file.write(strPorts[:-2])
|
||||||
|
|
||||||
|
file.write ( "\n );\n" )
|
||||||
|
file.write ( " end component;\n\n")
|
||||||
|
|
||||||
|
# Signals
|
||||||
|
for net in self._st_sigs :
|
||||||
|
if net._to_merge :
|
||||||
|
towrite = False
|
||||||
|
for paire in net._to_merge :
|
||||||
|
if paire == 0 : towrite = True
|
||||||
|
if not towrite : continue
|
||||||
|
if net._arity == 1 :
|
||||||
|
file.write ( " signal %s : std_logic;\n" % net._name )
|
||||||
|
else :
|
||||||
|
file.write ( " signal %s : std_logic_vector(%d downto %d);\n" % ( net._name, net._arity-1+net._ind, net._ind ) )
|
||||||
|
|
||||||
|
# Instances
|
||||||
|
file.write ( "\nbegin\n" )
|
||||||
|
for inst in self._st_insts :
|
||||||
|
#chaine = re.search ( "([^_]*)_(.*)", inst._name ) #XTOF FIXME !!!
|
||||||
|
#instName = chaine.group(1) #XTOF FIXME !!
|
||||||
|
file.write ( " %s : %s\n" % ( inst._name, inst._model ) )
|
||||||
|
file.write ( " port map(\n" )
|
||||||
|
|
||||||
|
# Map
|
||||||
|
strMap = ""
|
||||||
|
for pin in inst._map :
|
||||||
|
toto = False
|
||||||
|
tata = False
|
||||||
|
|
||||||
|
netInMap = inst._map[pin]
|
||||||
|
if netInMap._real_net :
|
||||||
|
nom = netInMap._real_net._name
|
||||||
|
else :
|
||||||
|
nom = netInMap._name
|
||||||
|
|
||||||
|
# <=
|
||||||
|
if netInMap._to_merge :
|
||||||
|
oneperone = True
|
||||||
|
for i in range ( len ( netInMap._to_merge ) ) :
|
||||||
|
paire = netInMap._to_merge[i]
|
||||||
|
|
||||||
|
if paire :
|
||||||
|
net = paire[0]
|
||||||
|
if i > 0 :
|
||||||
|
if netInMap._to_merge[i-1] != 0 :
|
||||||
|
netbefore = netInMap._to_merge[i-1][0]
|
||||||
|
else :
|
||||||
|
oneperone = False
|
||||||
|
break
|
||||||
|
if net != netbefore :
|
||||||
|
oneperone = False
|
||||||
|
break
|
||||||
|
if paire[1] != i :
|
||||||
|
oneperone = False
|
||||||
|
break
|
||||||
|
|
||||||
|
else :
|
||||||
|
toto = True
|
||||||
|
oneperone = False
|
||||||
|
break
|
||||||
|
|
||||||
|
# "easy" case : 1 per 1 corresponding
|
||||||
|
if oneperone :
|
||||||
|
netInMap = netInMap._to_merge[0][0]
|
||||||
|
nom = netInMap._name
|
||||||
|
|
||||||
|
# else : Cat of the different signals
|
||||||
|
else :
|
||||||
|
nom = catName ( netInMap, netInMap._to_merge )
|
||||||
|
|
||||||
|
# Cat
|
||||||
|
if netInMap._to_cat :
|
||||||
|
tata = True
|
||||||
|
nom = catName ( netInMap, netInMap._to_cat )
|
||||||
|
|
||||||
|
if toto and tata : print "Attention est ce un cas bien gere ???"
|
||||||
|
|
||||||
|
if netInMap not in self._st_vdds + self._st_vsss :
|
||||||
|
if pin == inst._map.keys()[0] : strMap += " %s => %s,\n" % ( pin, nom )
|
||||||
|
else : strMap += " %s => %s,\n" % ( pin, nom )
|
||||||
|
|
||||||
|
file.write(strMap[:-2] + '\n')
|
||||||
|
file.write ( " );\n\n" )
|
||||||
|
|
||||||
|
##### End #####
|
||||||
|
file.write('end structural;')
|
||||||
|
file.close ()
|
||||||
|
|
||||||
|
|
||||||
#### Quit : to quit the current cell without saving #####
|
#### Quit : to quit the current cell without saving #####
|
||||||
def Quit ( self ) :
|
def Quit ( self ) :
|
||||||
|
|
Loading…
Reference in New Issue