|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objecthades.utils.vhdl.VHDLWriter
export HADES models to VHDL-93 format.
VHDLWriter: a class to export HADES SimObjects to VHDL 93 format. When called with a HADES design, the VHDLWriter will try to construct a netlist (RT-level) architecture of the current HADES design, complete with all subdesigns and SimObjects.
VHDLWriter writes a separate .vhd file for each new subdesign encountered.
When called with a HADES SimObject, the VHDLwriter will try to write a corresponding VHDL architecture for that SimObject - either behavioural or netlist. If the SimObject implements the VHDLexportable interface, the VHDLexportable methods like writeEntity() and writeArchtecture() are called directly.
For a few other SimObjects, the VHDLModelFactory implements methods to write a compatible VHDL-93 behavioural architecture, e.g. for all basic and complex gates, and flipflops. Rtlib-support requires handling of generic declarations and should be available soon.
Otherwise, VHDLWriter tries to construct a VHDL entity declaration from the SimObject's ports and just writes an (empty) dummy architecture and configuration.
Some options of VHDLWriter can be specified via SetupManager properties in the 'hades.cnf' configuration files (please note the default values): However, THIS IS NOT IPLEMENTED YET.
The name mapping of Hades SimObject (Java) class name to VHDL names can be specified via an external properties file (third optional command line argument to main()). For example, create a file "my-vhdl-mapping.txt" and put in lines like "hades.models.gates.And2 AND2".
Field Summary | |
(package private) java.util.Hashtable |
architectureTable
|
(package private) java.util.Hashtable |
classmapTable
|
(package private) java.util.Hashtable |
componentDeclTable
|
(package private) java.util.Hashtable |
configurationTable
|
static boolean |
debug
|
(package private) java.lang.String |
defaultArchitectureName
|
(package private) java.lang.String |
defaultConfigurationName
|
(package private) Design |
design
|
(package private) boolean |
dontWritePowerPorts
|
(package private) java.lang.String |
fileName
|
(package private) java.util.Hashtable |
instanceTable
|
(package private) java.util.Stack |
makefileStack
|
(package private) VHDLModelFactory |
modelFactory
|
(package private) java.util.Hashtable |
nameToObjectTable
|
(package private) java.util.Hashtable |
objectToNameTable
|
(package private) java.io.File |
outputDirectory
|
(package private) java.io.PrintWriter |
printWriter
|
(package private) java.lang.String |
resourceName
|
static java.lang.String |
VERSION_ID
|
(package private) java.util.Hashtable |
vhdlFilesTable
|
Constructor Summary | |
VHDLWriter()
create a new VHDLWriter for a given Hades Design |
Method Summary | |
static void |
dbg(java.lang.String msg)
|
void |
dumpTables()
|
java.util.Hashtable |
getClassmapTable()
|
java.lang.String |
getEntityNameFromClassname(SimObject obj)
construct a valid VHDL entity name for a given SimObject or (Sub)Design. |
static java.lang.String |
getPortDirection(Port port)
|
static java.lang.String |
getPortSignalType(Port port)
|
static java.lang.String |
getSignalType(Signal signal)
|
static void |
main(java.lang.String[] argv)
check the VHDL output on the Hades Design specified via file/resource name argv[1] and write to the directory specified in argv[0] |
java.lang.String |
makeUniqueVHDLName(java.lang.Object obj,
java.lang.String objName)
|
java.lang.String |
makeUniqueVHDLName(Signal s)
|
java.lang.String |
makeUniqueVHDLName(SimObject so)
|
static java.lang.String |
makeVHDLName(java.lang.String s)
mangle name s until it is a valid VHDL87 or VHDL93 name. |
static java.lang.String |
makeVHDLPortName(Port port)
|
static void |
msg(java.lang.String msg)
|
void |
openDesignOutputFile()
|
void |
print(java.lang.String s)
|
void |
println(java.lang.String s)
|
void |
setClassmapTable(java.util.Hashtable ht)
|
void |
setDesign(Design design)
|
void |
setOutputDirectory(java.io.File dir)
|
java.lang.String |
tabulate(java.lang.String s,
int min_width,
int tab_width)
|
static void |
usage()
|
void |
writeComponentDeclaration(SimObject tmp)
write a VHDL component declaration for SimObject (or Subdesign) tmp. |
void |
writeComponentInstantiation(SimObject obj)
|
void |
writeDesign()
write a VHDL structural description of the current Design |
void |
writeDesignArchitecture()
|
void |
writeDesignComponentDeclarations()
|
void |
writeDesignConfiguration()
|
void |
writeDesignEntityDeclaration()
|
void |
writeDesignHeader()
|
void |
writeDesignNetlist()
|
void |
writeDesignPortList(Design design)
|
void |
writeDesignSignalDeclarations()
|
void |
writeIpinConnection(Ipin obj)
At the moment, Hades uses separate "Ipin" components as both interactive switches and to indicate hierarchy connections. |
void |
writeMakefile()
write a "makefile" script from the dependency information collected in vhldFilesTable and makefileStack. |
void |
writeOpinConnection(Opin obj)
see the discussion for Ipin |
void |
writeSimObjectComponentDeclaration(SimObject obj)
write a component declaration for SimObject 'obj'. |
void |
writeSubdesignComponentDeclaration(Design sub)
|
void |
writeSubdesignsAndSimobjects(Design parent)
|
Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
public static final java.lang.String VERSION_ID
public static boolean debug
Design design
java.lang.String resourceName
java.lang.String fileName
java.io.File outputDirectory
java.io.PrintWriter printWriter
VHDLModelFactory modelFactory
java.util.Hashtable componentDeclTable
java.util.Hashtable vhdlFilesTable
java.util.Stack makefileStack
java.util.Hashtable architectureTable
java.util.Hashtable configurationTable
java.util.Hashtable instanceTable
java.util.Hashtable classmapTable
java.util.Hashtable objectToNameTable
java.util.Hashtable nameToObjectTable
boolean dontWritePowerPorts
java.lang.String defaultArchitectureName
java.lang.String defaultConfigurationName
Constructor Detail |
public VHDLWriter()
Method Detail |
public void setClassmapTable(java.util.Hashtable ht)
public java.util.Hashtable getClassmapTable()
public void setOutputDirectory(java.io.File dir)
public void setDesign(Design design)
public void writeDesign()
public void writeSubdesignsAndSimobjects(Design parent)
public void openDesignOutputFile()
public void writeDesignHeader()
public void writeDesignEntityDeclaration()
public void writeDesignPortList(Design design)
public void writeDesignArchitecture()
public void writeDesignComponentDeclarations()
public void writeComponentDeclaration(SimObject tmp)
Due to the special role of Hades Ipin and Opin connectors, we do not write declarations for these components.
public void writeSubdesignComponentDeclaration(Design sub)
public void writeSimObjectComponentDeclaration(SimObject obj)
public void writeDesignSignalDeclarations()
public static java.lang.String getSignalType(Signal signal)
public void writeDesignNetlist()
public void writeIpinConnection(Ipin obj)
VHDL, on the other hand, uses signals directly - and it does not allow the same name for a component and a signal in one architecure.
To solve this mismatch, we do the following:
public void writeOpinConnection(Opin obj)
public void writeComponentInstantiation(SimObject obj)
public void writeDesignConfiguration()
public java.lang.String getEntityNameFromClassname(SimObject obj)
For other SimObjects, we use the SimObject classname as the key to check in classmapTable. If no mapping is found there, we convert the class name to a valid VHDL name by replacing '.' characters with '_' characters.
This algorithm does not currently check for name clashes resulting from upper/lowercase problems. e.g. "hades.models.gates.Inv" becomes "hades_models_gates_Inv".
public static java.lang.String makeVHDLName(java.lang.String s)
public java.lang.String makeUniqueVHDLName(Signal s)
public java.lang.String makeUniqueVHDLName(SimObject so)
public java.lang.String makeUniqueVHDLName(java.lang.Object obj, java.lang.String objName)
public static java.lang.String makeVHDLPortName(Port port)
public static java.lang.String getPortDirection(Port port)
public static java.lang.String getPortSignalType(Port port)
public void writeMakefile()
Currently, this simply lists the generated .vhd files in an order suitable for VHDL analysis, with the simobjects (simple models) first, then the subdesigns, and finally the top-level design.
"vhdlan" is used as the program name for the VHDL analyzer. Guess what simulator we have :-)
public void dumpTables()
public java.lang.String tabulate(java.lang.String s, int min_width, int tab_width)
public void print(java.lang.String s)
public void println(java.lang.String s)
public static void msg(java.lang.String msg)
public static void dbg(java.lang.String msg)
public static void usage()
public static void main(java.lang.String[] argv) throws java.lang.Exception
java.lang.Exception
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |