xschem/src/make_edif.awk

75 lines
1.7 KiB
Awk
Executable File

#!/bin/sh
# creates an edif port declaration netlist from a vhdl file
# usage: make_edif.awk file.vhd
# resulting netlist will be written in file.edif
#
# Warning:
# can be used on vhdl entities that have std_logic/std_logic_vector
# pins, any other types not recognized
# Also, types and ranges must NOT be referenced in packages or
# as constants/variables, if this is the case use the design_analyzer
# "EDIF save as" facility
#
# stefan, 23052002
awk '
BEGIN{
# get cell name
cell=ARGV[1]
sub(/\..*/,"",cell)
sub(/.*\//,"",cell)
outfile = cell ".edif"
# write header
print "(edif Synopsys_edif (edifVersion 2 0 0) (edifLevel 0)" >outfile
print " (library DESIGNS (edifLevel 0)" >outfile
print " (cell " cell " (cellType GENERIC)" >outfile
print " (view Netlist_representation (viewType NETLIST)" >outfile
print " (interface" >outfile
}
# do some clean up
{
$0=toupper($0)
sub(":"," : ",$0)
sub(/;.*/,"",$0)
sub("\("," ( ",$0)
sub("\)"," ) ",$0)
}
# parse only entity declaration
($1=="ENTITY" && $2==cell && $3== "IS") { entity=1 }
($1=="END" && $2==cell) { entity=0 }
# print port list
($0 ~ /^[ \t]*[A-Z0-9_]+[ \t]*:[ \t]* (IN|OUT|INOUT)[ \t]+STD_LOGIC/ && entity){
if($0 ~ /STD_LOGIC_VECTOR/) {
if($6 < $8) print "Warning, ascending bus: " $0
for( i=$6; i>=$8 ; i-- ) {
print " (port " $1 "_E2V_" i " (direction " dir($3) "))" > outfile
}
}
else {
print " (port " $1 " (direction " dir($3) "))" > outfile
}
}
# write trailer
END{
print " )" >outfile
print " )" >outfile
print " )" >outfile
print " )" >outfile
print ")" >outfile
}
function dir(d) {
if(d=="IN") return "INPUT"
else if(d=="OUT") return "OUTPUT"
else return "INOUT"
}
' $@