-
Notifications
You must be signed in to change notification settings - Fork 0
/
edifcook.py
152 lines (132 loc) · 4.63 KB
/
edifcook.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# This is EDIF netlist editor
# Design by Song 2018-09-27
import re
import sexpdata
# Initial parameters
extliblist = []
extinslist = []
# List External Library & Instance
def list_ext(display_on = 0):
while len(extliblist) != 0:
extliblist.pop()
while len(extinslist) != 0:
extinslist.pop()
for i in range(6, len(data)-1):
extliblist.append([data[i][1].value(), i])
for j in range(4, len(data[i])):
extinslist.append([data[i][j][1].value(), i, j, data[i][1].value()])
if display_on:
print(data[i][1].value(), data[i][j][1].value(), i, j)
# Rename External Library
def rename_ext_lib(tarlib, deslib):
for i in range(len(extliblist)):
if tarlib in extliblist[i]:
data[extliblist[i][1]][1] = sexpdata.loads(deslib)
list_ext()
return 1
return 0
# Rename External Instance
def rename_ext_inst(tarinst, desinst):
for i in range(len(extinslist)):
if tarinst in extinslist[i]:
data[extinslist[i][1]][extinslist[i][2]][1] = sexpdata.loads(desinst)
list_ext()
return 1
return 0
# New External Library
def new_ext_lib(deslib):
lastlib = len(extliblist)
if lastlib < 1:
return 0
else:
data.insert(6, data[6][0:4])
data[6][1] = sexpdata.loads(deslib)
list_ext()
return 1
# Copy External Instance
def copy_ext_inst(tarlib, tarinst, deslib, desinst):
for i in range(6, len(data) - 1):
if sexpdata.loads(tarlib) == data[i][1]:
for j in range(4, len(data[i])):
if sexpdata.loads(tarinst) == data[i][j][1]:
tmpdata = data[i][j].copy()
for k in range(6, len(data) - 1):
if sexpdata.loads(deslib) == data[k][1]:
for l in range(4, len(data[k])):
if sexpdata.loads(desinst) == data[k][l][1]:
return 1
data[k].append(tmpdata)
data[k][-1][1] = sexpdata.loads(desinst)
list_ext()
return 1
new_ext_lib(deslib)
data[6].append(tmpdata)
data[6][-1][1] = sexpdata.loads(desinst)
list_ext()
return 2
return 0
# Change Netlist Instance
def change_net_inst(tarlib, tarinst, deslib, desinst):
textdata = sexpdata.dumps(data[-1][-1][-1][-1][-1])
textdata = re.sub('\(cellRef %s \(libraryRef %s' % (tarinst, tarlib), '(cellRef %s (libraryRef %s' % (desinst, deslib), textdata)
data[-1][-1][-1][-1][-1] = sexpdata.loads(textdata)
# Change Netlist Library
def change_net_lib(tarlib, deslib):
textdata = sexpdata.dumps(data[-1][-1][-1][-1][-1])
textdata = re.sub('\(libraryRef %s' % (tarlib), '(libraryRef %s' % (deslib), textdata)
data[-1][-1][-1][-1][-1] = sexpdata.loads(textdata)
# Remove External Instance
# Clear All Empty External Library
def clear_ext_lib():
tdel = []
for i in range(6, len(data) - 1):
if len(data[i]) < 5:
tdel.append(i)
for i in range(len(tdel)):
data.pop(tdel[len(tdel) - i - 1])
list_ext()
# Replace Instance
def replace_ins(tarlib, tarinst, deslib, desinst):
copy_ext_inst(tarlib, tarinst, deslib, desinst)
change_net_inst(tarlib, tarinst, deslib, desinst)
def replace_lib(tarlib, deslib):
rename_ext_lib(tarlib, deslib)
change_net_lib(tarlib, deslib)
### Main from here ###
# Input file
infile = open("in.edif", "r")
# Output file
outfile = open("out.edif", "w")
logfile = open("log.edif", "w")
# Read a line from infile
data = sexpdata.load(infile)
infile.close()
# List Data
list_ext(0)
logfile.write('All EXT Instance:\n')
logfile.write(str(extinslist))
logfile.write('\nConverting begin\n')
# Replace from map.edif file
# map.edif:
# <tarlib> <tarinst> <deslib> <desinste>\n
#
# map.edif exp:
# hb180enh_digitalcell_S sizeB OD0003_sch_common sizeB
# hb180enh nch5_iso_nbl 1830bd15ba nch_svt_iso_nbl_5p0v
# OD0002_sch_ac LSH_5V OD0003_sch_common LSH_5V
# hb180enh_digitalcell_S INVX2_5v_ISO_NBL 1830bd15ba_v5nbl V5NBL_IVD1A
mapfile = open("map.edif", "r")
datamap = mapfile.read()
mapfile.close()
# Using DataMap
datamap = datamap.split('\n')
for i in range(len(datamap)):
datamap[i] = datamap[i].split()
replace_ins(datamap[i][0], datamap[i][1], datamap[i][2], datamap[i][3])
# Save to output file
outfile.write(sexpdata.dumps(data))
outfile.close()
logfile.write('\nConverting end\n')
logfile.write('Final List EXT Instance:\n')
logfile.write(str(extinslist))
logfile.close()