blob: 7869d0e6d6251feaced7ce2bde076af7838e0803 [file] [log] [blame]
#!/usr/bin/python3
TOTORO = '''
,--"""",--.__,---[],-------._
," __,' \ \--""""""==;-
," _,-" "/---.___ \ ___\ ,-'',"
/,-' / ;. ,.--'-.__\ _,-"" ,| `,' /
/``""""-._/,-|:\ []\,' ```-/:;-. `. /
` ;::: || /:,; `-.
=.,'__,---||-.____',.=
=(:\_ ||__ ):)=
,"::::`----||::`--':::"._
,':::::::::::||::::::::::::'.
.__ ;:::.-.:::::__||___:::::.-.:::\
"""-;:::( O )::::>_|| _<::::( O )::::-""
=======;:::::`-`:::::::||':::::::`-`:::::\===
,--"";:::_____________||______________::::""
; ::`._( | ||| | )_,'::::\_
,; :::`--._|____[]|_____|_.-':::::::::
;/ / :::::::::,||,:::::::::::::::::::
'''
lefName = "../../outputs/sky130_osu_sc_12T_hs.lef"
f = open(lefName,"r")
lefFile = f.read()
macroList = lefFile.split("MACRO")
nameList = []
#7.2 is height
widthList = []
multEleven = []
heightList = []
areaList = []
#Lists to keep track of the cells that are wrong
originBad = []
multBad = []
def stringToInt(x):
res=0
ctr=0
flag=1
for a in x:
if a=='.':
ctr=1
continue
if flag:
res=10*res+int(a)
else:
res=float(res)+int(a)*(10**(2-ctr))
if ctr:
ctr+=1
if ctr>2:
flag=0
return res
#Parse the LEF for important info
for i in range(1,len(macroList)):
# Lines to calculate the area and log the width and height as well as log
# if the width is a multiple of 11
nameList.append(macroList[i].split("\n")[0].strip())
sizeLine = macroList[i].split("SIZE")[1].split("\n")[0].split(" ")
widthList.append(stringToInt(sizeLine[1]))
heightList.append(stringToInt(sizeLine[3]))
areaList.append(widthList[i-1] * heightList[i-1])
if( (widthList[i-1] % 11) == 0):
multEleven.append("yes")
else:
multEleven.append("no")
#Lines to check the origin
originLine = macroList[i].split("ORIGIN")[1].split("\n")[0].split(" ")
if(float(originLine[1]) != 0 or float(originLine[2]) != 0):
print(nameList[i-1] + " Origin not 0 0")
originBad.append(nameList[i-1])
#A bit of a bad way to do this but
#This gets the footprint and accounts
#for cells that start with X
footprintList = []
for name in nameList:
if("X" in name):
nameSplit = name.split("X")
tempFoot = ""
if(name[0] is "X"):
tempFoot = tempFoot + "X"
for inc in range(len(nameSplit)-1) :
tempFoot = tempFoot + nameSplit[inc]
footprintList.append(tempFoot)
else:
footprintList.append(name)
#Print to screen which cells are not a multiple of 11
for name,width,height,area,mult11 in zip(nameList,widthList,heightList,areaList,multEleven):
if(mult11 is "no"):
print("______________________________________________________________")
print("Cell " + name + " does not have a size that is a multiple of 11")
print("Name | Width | Height | Area")
print(name,str(width/100),str(height/100),str(area/10000))
print("______________________________________________________________")
multBad.append(name)
#Report which cells are incorrect to the log
#Incorrect Origin Reporting
writeReport = open("../../outputs/cellRules.log","w+")
if(len(originBad) > 0):
writeReport.write("The following cells do not have an origin of 0 0\n")
writeReport.write("_____________________________________________________\n")
for name in originBad:
writeReport.write(name + "\n")
writeReport.write("\n\n\n")
#Incorrect Width reporting
if(len(multBad)>0):
writeReport.write("The following cells do not have a width that is a multiple of 11\n")
writeReport.write("_____________________________________________________\n")
for name in multBad:
writeReport.write(name + "\n")
if(len(originBad) == 0 and len(multBad) == 0):
print("ALL IS GOOD HAVE A TOTORO")
writeReport.write("All is good :)")
writeReport.write(TOTORO)
print(TOTORO)
#Write areaData and footprint to file. Uncomment lines in for loop to add other things
writeF = open("../../outputs/areaData.lib", "w+")
writeF.write("library (s8_osu130) {\n")
for name,width,height,area,mult11,footprint in zip(nameList,widthList,heightList,areaList,multEleven,footprintList):
writeF.write("\n\ncell(" + name + ") {")
#writeF.write("\nwidth : " + str(width/100))
#writeF.write("\nheight : " + str(height/100))
writeF.write("\narea : " + str(area/10000) + ";")
writeF.write("\ncell_footprint : " + footprint + ";")
#writeF.write("SizeCorrect : " + str(mult11))
writeF.write("\n}")
writeF.write("\n}")