diff options
Diffstat (limited to 'src/converter/schematic_converters/lib/PythonLib/component.py')
-rw-r--r-- | src/converter/schematic_converters/lib/PythonLib/component.py | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/src/converter/schematic_converters/lib/PythonLib/component.py b/src/converter/schematic_converters/lib/PythonLib/component.py new file mode 100644 index 00000000..8654f836 --- /dev/null +++ b/src/converter/schematic_converters/lib/PythonLib/component.py @@ -0,0 +1,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') |