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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
|
#The MIT License (MIT)
#PSpice to Oscad Schematic Converter
#This code is written by Suryavamshi Tenneti, FOSSEE, IIT Bombay
#The code is modified by Sumanto Kar and Gloria Nandihal, FOSSEE, IIT Bombay
from header import *
from attribute import *
from design import *
from misc import *
class Pin:
#position of pin and length of the pin.Pin constructor reading values from corresponding component's pspice library
x = 0
y = 0
length = 0
#pin_number is the pin number and elec_type is the electrical type
n = ''
elec_type = ''
#to store the orientation of pin
orientation = ''
found = 0
tmp = 0
x1 = 0
x2 = 0
y1 = 0
y2 = 0
def __init__(self, input_stream = None):
line = ''
temp =''
inline = input_stream.readline().split()
#print(inline)
t,self.tmp,self.x1,self.y1,temp,temp,self.n,temp,self.x2,self.y2,self.orientation = inline
self.x = int(self.x2)*MULT #x co-ordinate of the pin
self.y = int(self.y2)*(-1)*MULT #y co-ordinate of the pin
self.length = 10*MULT #calculating pin length from points of pins
#line = input_stream.readline()
g = input_stream.tell()
line = input_stream.readline()
while(line[0] == 'a'): #Read the attributes of the pins. lines starting from 'a' stores the attributes
attr = Attribute(line) #called the attribute constructor to store the attributes
if attr.name == 'ERC' or attr.name == 'erc': #if the attribute name is 'ERC' or 'erc' its value is the electrical type of the pin
self.elec_type = attr.value
g = input_stream.tell()
line = input_stream.readline()
input_stream.seek(g)
def print(self, output_stream, shiftx, shifty): #converting the annotation to KiCad format as different letters are use in PSpice and KiCad libraries
output_stream.write("X"+" "+"~ "+str(self.n)+" "+str(self.x-shiftx)+" "+str(self.y-((-1)*shifty))+" "+str(self.length)+" ")
if self.orientation == 'h':
output_stream.write('R') # If Pspice orientation is h, then map it to Right direction
elif self.orientation == 'u':
output_stream.write('L') #If Pspice orientation is u, then map it to Left direction
elif self.orientation == 'v':
output_stream.write('U') #If Pspice orientation is v, then map it to Up direction
elif self.orientation == 'd':
output_stream.write('D') #If Pspice orientation is d, then map it to Down direction
output_stream.write(' 30 30 0 1 ') # Mapping electrical tupe of PSpice component to KiCad component
if self.elec_type == 'i':
output_stream.write('I\n') #If Pspice electrical type is i, then map it to Input
elif self.elec_type == 'o':
output_stream.write('O\n') #If Pspice electrical type is o, then map it to Output
elif self.elec_type == 'p':
output_stream.write('W\n') #If Pspice electrical type is p, then map it to Tristate
elif self.elec_type == 'x':
output_stream.write('P\n') #If Pspice electrical type is x, then map it to Passive
elif self.elec_type == 'b':
output_stream.write('B\n') #If Pspice electrical type is b, then map it to Bidirectional
else:
output_stream.write('P\n') #else map it to Passive
class Component: #Component class method makePins to design pins
#default Component class constructor
type_ = ''
ref = ''
value = ''
pins = []
des = None
def __init__(self, input_stream = None, t = ''):
self.pins = []
self.type_ = t
if(input_stream != None):
g = input_stream.tell() #To get to the starting point of the component's type in pspice library file
line = ''
'''while(('*symbol '+t) not in line):
input_stream.seek(g)
line = input_stream.readline().strip()
g = input_stream.tell()
'''
line = skipTo(input_stream, ('*symbol '+t))
#print('Component Line->', line)
''' input_stream.seek(g)
g = input_stream.tell()
print('Search t',line[line.rfind(' ')+1:])
'''
while(line != '' and line.find('ako')!= -1):
#print('in finding ako')
a = line.rfind(' ')+1
t = line[a:]
input_stream.seek(g)
'''while(('*symbol '+t) not in line):
line = input_stream.readline().strip()
print('Searching ako ref',line)'''
line = skipTo(input_stream, ('*symbol '+t)) #To get the pspice library of the components having its description written elsewhere
#print('In component constructor')
line = input_stream.readline().strip()
'''while('@attributes' not in line):
line = input_stream.readline().strip()'''
skipTo(input_stream, '@attributes') #creating attributes by calling its constructor
g = input_stream.tell()
line = input_stream.readline().strip() #assigning attributes of PKGREF to the component
while(line[0] == 'a'):
attr = Attribute(line)
if attr.name == 'REFDES' or attr.name == 'refdes':
self.ref = attr.value[:-1]
if attr.name == 'VALUE' or attr.name == 'DC' or attr.name == 'GAIN' or attr.name == 'COEFF' or attr.name == 'VPOS' or attr.name == 'VNEG':
self.value = attr.value #assigning attributes of above cases to the component
g = input_stream.tell()
line = input_stream.readline().strip()
input_stream.seek(g)
'''
line = input_stream.readline().strip()
while('@pins' not in line):
line = input_stream.readline().strip()
'''
skipTo(input_stream, '@pins') #to get to the starting point of the pins of the type required
self.makePins(input_stream) #calling makepins function to create pins
g = input_stream.tell()
line = input_stream.readline().strip()
while('@graphics' not in line):
input_stream.seek(g)
#print('***',line)
g = input_stream.tell()
line = input_stream.readline().strip()
input_stream.seek(g)
d = Design(input_stream) #calling Design constructor to create design
self.des = d
#print('Before fixComp',self.type_, 'ref=', self.ref)
def makePins(self,input_stream):
#print('making pins')
line = ''
g = input_stream.tell()
line = input_stream.readline().strip()
while(line[0] == 'p'): #Read the pins line from pspice library
input_stream.seek(g)
p = Pin(input_stream) #call the Pin constructor to get the values and pass the library as the parameter
self.pins.append(p)
g = input_stream.tell() #move to the next line to get next 'p' line
line = input_stream.readline().strip()
input_stream.seek(g)
def print(self, output_stream): #print function of class Pin to print the pins in output's cache lib file
output_stream.write('#\n# '+self.type_+'\n#\nDEF '+self.type_+' '+self.ref+' 0 30 Y Y 1 F N'+'\n')#upto DEF line printed
output_stream.write('F0 \"'+self.ref+"\" 0 0 30 H V L CNN"+'\n') #F0 line
output_stream.write('F1 \"'+self.type_+'\" 0 60 30 H V L CNN'+'\n') #F1 line
output_stream.write('DRAW\n') #calling print funcition of design to print design of components
self.des.print(output_stream)
for i in range(len(self.pins)):
self.pins[i].print(output_stream, self.des.shiftx, self.des.shifty) #calling print function of pins class to print pins
output_stream.write('ENDDRAW\n'+'ENDDEF\n')
|