summaryrefslogtreecommitdiff
path: root/src/converter/schematic_converters/lib/PythonLib/component.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/converter/schematic_converters/lib/PythonLib/component.py')
-rw-r--r--src/converter/schematic_converters/lib/PythonLib/component.py169
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')