def getValue(self, time=0): Margin = string2num(self.A) Phase = string2num(self.w) SinPhi = string2num(self.phi) Voffset = string2num(self.Vo) valueV = Margin * sin(Phase * time + SinPhi) + Voffset return valueV
def parseDcSimulation(dcSimString=''): #parse DC simulation dcSimString = dcSimString.replace('.dc ', '').strip() dcSimlist = dcSimString.split(' ') if len(dcSimlist) < 4: print("Error: Less parameters than Expected!") exit() elif len(dcSimlist) == 4: dcSimParaTemp = SweepPara() dcSimParaTemp.paramName = dcSimlist[0] dcSimParaTemp.paramValueStart = string2num(dcSimlist[1]) dcSimParaTemp.paramValueStop = string2num(dcSimlist[2]) dcSimParaTemp.paramValueStep = string2num(dcSimlist[3]) parameters.listDCParam.append(dcSimParaTemp) elif len(dcSimlist) == 9 & dcSimlist[4] == 'sweep': dcSimParaTemp = SweepPara() dcSimParaTemp.paramName = dcSimlist[0] dcSimParaTemp.paramValueStart = string2num(dcSimlist[1]) dcSimParaTemp.paramValueStop = string2num(dcSimlist[2]) dcSimParaTemp.paramValueStep = string2num(dcSimlist[3]) parameters.listDCParam.append(dcSimParaTemp) dcSimSweepTemp = SweepPara() dcSimSweepTemp.paramName = dcSimlist[5] dcSimSweepTemp.paramValueStart = string2num(dcSimlist[6]) dcSimSweepTemp.paramValueStop = string2num(dcSimlist[7]) dcSimSweepTemp.paramValueStep = string2num(dcSimlist[8]) parameters.listDCParam.append(dcSimSweepTemp) else: print("Error: DC Simulation Expression is ERROR!") exit()
def parseIs(IsString=''): IsParaList = IsString.split(' ') if len(IsParaList) > 4: print('----ERROR: More parameters than expected!') return '----False' elif len(IsParaList) < 4: print('----ERROR: Less parameters than expected!') return '----False' else: IsTemp = DCCurrent() IsTemp.name = IsParaList[0] IsTemp.portPos = IsParaList[1] IsTemp.portNeg = IsParaList[2] IsTemp.value = IsParaList[3] value = string2num(IsTemp.value) addNode(IsTemp.portPos) addNode(IsTemp.portNeg) parameters.listDCI.append(IsTemp) print('\t RHS') print(IsTemp.portPos, '\t', -1 * value) print(IsTemp.portNeg, '\t', value) print('') return IsTemp return ''
def loadMatH(self,MatAddr=0,Vctl=0): portPos = parameters.NodesDict.get(self.portPos) portNeg = parameters.NodesDict.get(self.portNeg) portCtlPos = parameters.NodesDict.get(self.ctlNodePos) portCtlNeg = parameters.NodesDict.get(self.ctlNodeNeg) ValueHk = string2num(self.transResValue) self.matStampsH[PointMat(MatAddr,MatAddr+1)] = -1 * ValueHk if portPos != 0: self.matStampsH[PointMat(MatAddr,portPos-1)] = 1 self.matStampsH[PointMat(portPos-1,MatAddr)] = 1 if portNeg != 0: self.matStampsH[PointMat(MatAddr,portNeg-1)] = -1 self.matStampsH[PointMat(portNeg-1,MatAddr)] = -1 if portCtlPos != 0: self.matStampsH[PointMat(MatAddr+1,portCtlPos-1)] = 1 self.matStampsH[PointMat(portCtlPos-1,MatAddr+1)] = 1 if portCtlNeg != 0: self.matStampsH[PointMat(MatAddr+1,portCtlNeg-1)] = -1 self.matStampsH[PointMat(portCtlNeg-1,MatAddr+1)] = -1
def parseAcSimulation(acSimString=''): acSimString = acSimString.replace('.ac ', '').strip() acSimlist = acSimString.split(' ') if len(acSimlist) < 3: print("Error: Less parameters than Expected!") exit() elif len(acSimlist) == 3: acSimParaTemp = SweepF() acSimParaTemp.paramName = acSimlist[0] acSimParaTemp.paramFStart = string2num(acSimlist[1]) acSimParaTemp.paramFStop = string2num(acSimlist[2]) parameters.listACParam.append(acSimParaTemp) elif len(acSimlist) == 7 & acSimlist[4] == 'sweep': #Wouldnt here acSimParaTemp = SweepF() acSimParaTemp.paramName = acSimlist[0] acSimParaTemp.paramFStart = string2num(acSimlist[1]) acSimParaTemp.paramFStop = string2num(acSimlist[2]) parameters.listACParam.append(acSimParaTemp) acSimSweepTemp = SweepF() acSimSweepTemp.paramName = acSimlist[4] acSimSweepTemp.paramFStart = string2num(acSimlist[5]) acSimSweepTemp.paramFStop = string2num(acSimlist[6]) parameters.listACParam.append(acSimSweepTemp) else: print("Error: AC Simulation Expression is ERROR!") exit() #ACSimulation() #Start AC Simulation
def getVoltage(self, Time): LowVoltage_value = string2num(self.LowVoltage) HighVoltage_value = string2num(self.HighVoltage) Tdelay = string2num(self.Tdelay) Trise = string2num(self.Trise) Tfall = string2num(self.Tfall) Twide = string2num(self.Twide) Tperiod = string2num(self.Tperiod) if Tperiod < (Trise + Tfall + Twide): print("****Error! Time Define Error in Pluse Power", self.name) if Time < (Tdelay + Tperiod): Time_temp = Time else: Count = int((Time - Tdelay) / Tperiod) Time_temp = Time - Tperiod * Count Voltage_t = 0.0 if Time_temp <= Tdelay: Voltage_t = LowVoltage_value elif (Time_temp > Tdelay) & (Time_temp <= (Tdelay + Trise)): Voltage_t = (LowVoltage_value + (HighVoltage_value - LowVoltage_value) / Trise * (Time_temp - Tdelay)) elif (Time_temp > (Tdelay + Trise)) & (Time_temp <= (Tdelay + Trise + Twide)): Voltage_t = HighVoltage_value elif (Time_temp > (Tdelay + Trise + Twide)) & (Time_temp <= (Tdelay + Trise + Twide + Tfall)): Voltage_t = HighVoltage_value - ( HighVoltage_value - LowVoltage_value) / Tfall * ( Time_temp - Tdelay - Trise - Twide) elif (Time_temp > (Tdelay + Trise + Twide + Tfall)) & (Time_temp <= (Tdelay + Tperiod)): Voltage_t = LowVoltage_value else: Voltage_t = 0 return Voltage_t
def parseTranSimulation(TranSimulationString = ''): TranSimulationString = TranSimulationString.replace('.tran ','').strip() listTranTemp = TranSimulationString.split(' ') TranParamTemp = TranParam() if len(listTranTemp) == 2: TranParamTemp.StepTime = string2num(listTranTemp[0]) TranParamTemp.StopTime = string2num(listTranTemp[1]) parameters.listTranParam.append(TranParamTemp) elif len(listTranTemp) == 3: TranParamTemp.StepTime = string2num(listTranTemp[0]) TranParamTemp.StopTime = string2num(listTranTemp[1]) if (listTranTemp[2] == 'uic'): TranParamTemp.UIC = True elif ('tstart' in listTranTemp[2]): TranParamTemp.StartTime = string2num(listTranTemp[2].split('=')[1]) else: print( "Error: Tran parameter Unknown!",listTranTemp[2]) exit() parameters.listTranParam.append(TranParamTemp) elif len(listTranTemp) == 4: TranParamTemp.StepTime = string2num(listTranTemp[0]) TranParamTemp.StopTime = string2num(listTranTemp[1]) if ('tstart' in listTranTemp[2]): TranParamTemp.StartTime = string2num(listTranTemp[2].split('=')[1]) else: print( "Error: Tran parameter Unknown!",listTranTemp[2]) exit() if (listTranTemp[3] == 'uic'): TranParamTemp.UIC = True else: print( "Error: Tran parameter Unknown!",listTranTemp[3]) exit() parameters.listTranParam.append(TranParamTemp) else: print( "Error: Tran Params More Than Expected!") exit()
def loadMatG(self): portPos = parameters.NodesDict.get(self.portPos) portNeg = parameters.NodesDict.get(self.portNeg) portCtlPos = parameters.NodesDict.get(self.ctlNodePos) portCtlNeg = parameters.NodesDict.get(self.ctlNodeNeg) ValueGk = string2num(self.transconValue) if portPos != 0: if portCtlPos != 0: self.matStampsG[PointMat(portPos-1,portCtlPos-1)] = ValueGk if portCtlNeg != 0: self.matStampsG[PointMat(portPos-1,portCtlNeg-1)] = -1 * ValueGk if portNeg != 0: if portCtlPos != 0: self.matStampsG[PointMat(portNeg-1,portCtlPos-1)] = -1 * ValueGk if portCtlNeg != 0: self.matStampsG[PointMat(portNeg-1,portCtlNeg-1)] = ValueGk
def loadMatF(self,MatAddr=0,Vctl=0): portPos = parameters.NodesDict.get(self.portPos) portNeg = parameters.NodesDict.get(self.portNeg) portCtlPos = parameters.NodesDict.get(self.ctlNodePos) portCtlNeg = parameters.NodesDict.get(self.ctlNodeNeg) valueFk = string2num(self.currentGain) self.matRhsF[PointMat(MatAddr,0)] = Vctl if portPos != 0: self.matStampsF[PointMat(portPos-1,MatAddr)] = valueFk if portNeg != 0: self.matStampsF[PointMat(portNeg-1,MatAddr)] = -1 * valueFk if portCtlPos != 0: self.matStampsF[PointMat(portCtlPos-1,MatAddr)] = 1 self.matStampsF[PointMat(MatAddr,portCtlPos-1)] = 1 if portCtlNeg != 0: self.matStampsF[PointMat(portCtlNeg-1,MatAddr)] = -1 self.matStampsF[PointMat(MatAddr,portCtlNeg-1)] = -1
def loadMatE(self,MatAddr=0): portPos = parameters.NodesDict.get(self.portPos) portNeg = parameters.NodesDict.get(self.portNeg) portCtlPos = parameters.NodesDict.get(self.ctlNodePos) portCtlNeg = parameters.NodesDict.get(self.ctlNodeNeg) valueEk = string2num(self.voltageGain) if portPos != 0: self.matStampsE[PointMat(MatAddr,portPos-1)] = 1 self.matStampsE[PointMat(portPos-1,MatAddr)] = 1 if portNeg != 0: self.matStampsE[PointMat(MatAddr,portNeg-1)] = -1 self.matStampsE[PointMat(portNeg-1,MatAddr)] = -1 if portCtlPos != 0: self.matStampsE[PointMat(MatAddr,portCtlPos-1)] = -1 * valueEk if portCtlNeg != 0: self.matStampsE[PointMat(MatAddr,portCtlNeg-1)] = valueEk
def loadMatResistor(self): self.StampMatDict = {} port1 = parameters.NodesDict.get(self.port1) port2 = parameters.NodesDict.get(self.port2) valueResistor = string2num(self.value) if port1 != 0: if port2 != 0: self.StampMatDict[PointMat(port1-1,port1-1)] = 1.0/valueResistor self.StampMatDict[PointMat(port2-1,port2-1)] = 1.0/valueResistor self.StampMatDict[PointMat(port1-1,port2-1)] = -1.0/valueResistor self.StampMatDict[PointMat(port2-1,port1-1)] = -1.0/valueResistor else: self.StampMatDict[PointMat(port1-1,port1-1)] = 1.0/valueResistor else: if port2 != 0: self.StampMatDict[PointMat(port2-1,port2-1)] = 1.0/valueResistor else: pass
def parseInductor(IndString = ''): IndParaList = IndString.split(' ') if len(IndParaList) > 4: print('----ERROR: More parameters than expected!') return '----False' elif len(IndParaList) < 4: print('----ERROR: Less parameters than expected!') return '----False' else : InductorTemp = Inductor() InductorTemp.name = IndParaList[0] InductorTemp.port1 = IndParaList[1] InductorTemp.port2 = IndParaList[2] InductorTemp.value = IndParaList[3] addNode(InductorTemp.port1) addNode(InductorTemp.port2) parameters.listL.append(InductorTemp) value = string2num(InductorTemp.value) #print("--AC stamp") #print('\t|',InductorTemp.port1,'\t|',InductorTemp.port2, '\t| I', '\t\t| RHS') #print(InductorTemp.port1,'\t|',0,'\t|',0,'\t|',1,'\t\t|',0) #print(InductorTemp.port2,'\t|',0,'\t|',0,'\t|',-1,'\t\t|',0) #print('branch','\t|',1,'\t|',-1,'\t|',-1*value,'s','\t|',0) #rint '' #print('\t',InductorTemp.port1,'\t',InductorTemp.port2,'\t') #print(InductorTemp.port1,' ',1/value,' \t',-1/value) #print(InductorTemp.port2,' ',-1/value,' \t',1/value) #print('') return InductorTemp return ''
def getOutDataOp(MatResult): WriteString = '' for node in parameters.NodesDict: if node != '0': WriteString = WriteString + str( MatResult[parameters.NodesDict.get(node) - 1, 0]) + '\t' parameters.opValue.append( MatResult[parameters.NodesDict.get(node) - 1, 0]) for index in range(len(parameters.listDCV)): #V -> Pluse -> SinV -> E -> F -> H -> L matAddr = len(parameters.NodesDict) + index - 1 WriteString = WriteString + str(MatResult[matAddr, 0]) + '\t' parameters.opValue.append(MatResult[matAddr, 0]) for index in range(len(parameters.listPulseV)): #V -> Pluse -> SinV -> E -> F -> H -> L matAddr = len(parameters.NodesDict) + len( parameters.listDCV) + index - 1 WriteString = WriteString + str(MatResult[matAddr, 0]) + '\t' parameters.opValue.append(MatResult[matAddr, 0]) for index in range(len(parameters.listSinV)): #V -> Pluse -> SinV -> E -> F -> H -> L matAddr = len(parameters.NodesDict) + len(parameters.listDCV) \ + len(parameters.listPulseV) + index - 1 WriteString = WriteString + str(MatResult[matAddr, 0]) + '\t' parameters.opValue.append(MatResult[matAddr, 0]) for index in range(len(parameters.listE)): #V -> Pluse -> SinV -> E -> F -> H -> L matAddr = len(parameters.NodesDict) + len(parameters.listDCV) \ + len(parameters.listPulseV) + len(parameters.listSinV) \ + index - 1 WriteString = WriteString + str(MatResult[matAddr, 0]) + '\t' parameters.opValue.append(MatResult[matAddr, 0]) for index in range(len(parameters.listF)): #V -> Pluse -> SinV -> E -> F -> H -> L matAddr = len(parameters.NodesDict) + len(parameters.listDCV) \ + len(parameters.listPulseV) + len(parameters.listSinV) \ + len(parameters.listE) + index - 1 WriteString = WriteString + str(MatResult[matAddr, 0]) + '\t' parameters.opValue.append(MatResult[matAddr, 0]) for index in range(len(parameters.listH)): #V -> Pluse -> SinV -> E -> F -> H -> L matAddr = len(parameters.NodesDict) + len(parameters.listDCV) \ + len(parameters.listPulseV) + len(parameters.listSinV) \ + len(parameters.listE) + len(parameters.listF) \ + 2 * index - 1 WriteString = WriteString + str(MatResult[matAddr, 0]) + '\t' parameters.opValue.append(MatResult[matAddr, 0]) for index in range(len(parameters.listL)): #V -> Pluse -> SinV -> E -> F -> H -> L matAddr = len(parameters.NodesDict) + len(parameters.listDCV) \ + len(parameters.listPulseV) + len(parameters.listSinV) \ + len(parameters.listE) + len(parameters.listF) \ + 2 * len(parameters.listH) + index - 1 WriteString = WriteString + str(MatResult[matAddr, 0]) + '\t' parameters.opValue.append(MatResult[matAddr, 0]) for resistor in parameters.listR: port1 = parameters.NodesDict.get(resistor.port1) port2 = parameters.NodesDict.get(resistor.port2) Rvalue = string2num(resistor.value) if (port1 != 0) & (port2 != 0): R_V = MatResult[port1 - 1, 0] - MatResult[port2 - 1, 0] elif (port1 == 0) & (port2 != 0): R_V = -1 * MatResult[port2 - 1, 0] elif (port1 != 0) & (port2 == 0): R_V = MatResult[port1 - 1, 0] else: R_V = 0 IValue = R_V / Rvalue WriteString = WriteString + str(IValue) + '\t' parameters.opValue.append(IValue) for diode in parameters.listD: port1 = parameters.NodesDict.get(diode.port1) port2 = parameters.NodesDict.get(diode.port2) if (port1 != 0) & (port2 != 0): D_V = MatResult[port1 - 1, 0] - MatResult[port2 - 1, 0] elif (port1 == 0) & (port2 != 0): D_V = -1 * MatResult[port2 - 1, 0] elif (port1 != 0) & (port2 == 0): D_V = MatResult[port1 - 1, 0] else: D_V = 0 D_I = diode.getI_V(D_V) WriteString = WriteString + str(D_I) + '\t' parameters.opValue.append(D_I) for MosFet in parameters.listM: pass for vccs_g in parameters.listG: ctlNodePos = parameters.NodesDict.get(vccs_g.ctlNodePos) ctlNodeNeg = parameters.NodesDict.get(vccs_g.ctlNodeNeg) if (ctlNodePos != 0) & (ctlNodeNeg != 0): C_V = MatResult[ctlNodePos - 1, 0] - MatResult[ctlNodeNeg - 1, 0] elif (port1 == 0) & (port2 != 0): C_V = -1 * MatResult[ctlNodeNeg - 1, 0] elif (port1 != 0) & (port2 == 0): C_V = MatResult[ctlNodePos, 0] else: C_V = 0 vccs_I = vccs_g.getI(C_V) WriteString = WriteString + str(vccs_I) + '\t' parameters.opValue.append(vccs_I) return WriteString
def OpSimulation(): print("Info: OP Simulation ...") NodeNum = len(parameters.NodesDict) - 1 # Nodes but GND branchnum = len(parameters.listDCV) + len(parameters.listPulseV) \ + len(parameters.listSinV) + len(parameters.listE) \ + len(parameters.listF) + 2 * len(parameters.listH) \ + len(parameters.listL) #V -> Pluse -> SinV -> E -> F -> H -> L MatNum = NodeNum + branchnum MatStamps = np.mat(np.zeros((MatNum, MatNum))) MatRhs = np.mat(np.zeros((MatNum, 1))) MatResult = np.mat(np.zeros((MatNum, 1))) parameters.opExpString = getOutTitleOp() if (len(parameters.listD) != 0) | (len(parameters.listM) != 0): if (len(parameters.listD) != 0): MarkPort = parameters.NodesDict.get(parameters.listD[0].port1) elif len(parameters.listM) != 0: MarkPort = parameters.NodesDict.get(parameters.listM[0].portD) else: print("Error: Logic Error!") #Wouldn't Here return lastVMarkPort = 1.8 #No mater VMarkPort = 0.9 #count = 0 InitFlag = True while abs(VMarkPort - lastVMarkPort) > 0.000001: #print(VMarkPort) MatStamps = np.mat(np.zeros((MatNum, MatNum))) MatRhs = np.mat(np.zeros((MatNum, 1))) for elem in parameters.listR: #Load R elem.loadMatResistor() for keyPoint in elem.StampMatDict: MatStamps[keyPoint.pointX, keyPoint.pointY] += elem.StampMatDict.get( keyPoint) for elem in parameters.listD: #load D port1 = parameters.NodesDict.get(elem.port1) port2 = parameters.NodesDict.get(elem.port2) if (port1 != 0) & (port2 != 0): ResultVd_temp = MatResult[port1 - 1, 0] - MatResult[port2 - 1, 0] elif port1 == 0: ResultVd_temp = -1 * MatResult[port2 - 1, 0] elif port2 == 0: ResultVd_temp = MatResult[port1 - 1, 0] else: ResultVd_temp = 0 elem.loadMatDiode(ResultVd_temp) for keyPoint in elem.StampMatDict: MatStamps[keyPoint.pointX, keyPoint.pointY] += elem.StampMatDict.get( keyPoint) for keyPoint in elem.RHSMatDict: MatRhs[keyPoint.pointX, keyPoint.pointY] += elem.RHSMatDict.get(keyPoint) for elem in range(len(parameters.listE)): #Load E #V -> Pluse -> SinV -> E -> F -> H -> L matAddr = len(parameters.NodesDict) + len(parameters.listDCV) \ + len(parameters.listPulseV) + len(parameters.listSinV) + elem - 1 parameters.listE[elem].loadMatE(matAddr) for keyPoint in parameters.listE[elem].matStampsE: MatStamps[keyPoint.pointX, keyPoint.pointY] = parameters.listE[ elem].matStampsE.get(keyPoint) for elem in range(len(parameters.listF)): #loadF #V -> Pluse -> SinV -> E -> F -> H -> L portCtlPos = parameters.NodesDict.get( parameters.listF[elem].ctlNodePos) portCtlNeg = parameters.NodesDict.get( parameters.listF[elem].ctlNodePos) matAddr = len(parameters.NodesDict) + len(parameters.listDCV) \ + len(parameters.listPulseV) + len(parameters.listSinV) \ + len(parameters.listE) + elem - 1 Vctl = MatResult[portCtlPos - 1] - MatResult[portCtlNeg - 1] parameters.listF[elem].loadMatF(matAddr, Vctl) for keyPoint in parameters.listF[elem].matStampsF: MatStamps[keyPoint.pointX, keyPoint.pointY] = parameters.listF[ elem].matStampsF.get(keyPoint) for keyPoint in parameters.listF[elem].matStampsF: MatRhs[keyPoint.pointX, keyPoint.pointY] = parameters.listF[ elem].matRhsF.get(keyPoint) for elem in parameters.listG: #loadG elem.loadMatG() for keyPoint in elem.matStampsG: MatStamps[keyPoint.pointX, keyPoint.pointY] += elem.matStampsG.get(keyPoint) for elem in range(len(parameters.listH)): #load H #V -> Pluse -> SinV -> E -> F -> H -> L matAddr = len(parameters.NodesDict) + len(parameters.listDCV) \ + len(parameters.listPulseV) + len(parameters.listSinV) \ + len(parameters.listE) + len(parameters.listF) + 2 * elem - 1 portCtlPos = parameters.NodesDict.get( parameters.listH[elem].ctlNodePos) portCtlNeg = parameters.NodesDict.get( parameters.listH[elem].ctlNodePos) Vctl = MatResult[portCtlPos - 1] - MatResult[portCtlNeg - 1] parameters.listH[elem].loadMatH(matAddr, Vctl) MatRhs[matAddr + 1] = string2num( parameters.listH[elem].transResValue) for keyPoint in parameters.listH[elem].matStampsH: MatStamps[keyPoint.pointX, keyPoint.pointY] = parameters.listH[ elem].matStampsH.get(keyPoint) for elem in parameters.listDCI: #load DC Is elem.loadMatDCIs() for keyPoint in elem.RHSMatDict: MatRhs[keyPoint.pointX, keyPoint.pointY] += elem.RHSMatDict.get(keyPoint) for elem in range(len(parameters.listDCV)): #load DC Vs #V -> Pluse -> SinV -> E -> F -> H -> L VsDC = parameters.listDCV[elem] matAddr = len(parameters.NodesDict) + elem - 1 portPos = parameters.NodesDict.get(VsDC.portPos) portNeg = parameters.NodesDict.get(VsDC.portNeg) DCV_Value = string2num(VsDC.value) MatRhs[matAddr, 0] = DCV_Value MatResult[portPos - 1, 0] = DCV_Value if portPos != 0: MatStamps[matAddr, portPos - 1] = 1 MatStamps[portPos - 1, matAddr] = 1 if portNeg != 0: MatStamps[matAddr, portNeg - 1] = -1 MatStamps[portNeg - 1, matAddr] = -1 for elem in range(len(parameters.listPulseV)): #load DC Pluse #V -> Pluse -> SinV -> E -> F -> H -> L VsPluseDC = parameters.listPulseV[elem] matAddr = len(parameters.NodesDict) + len( parameters.listDCV) + elem - 1 portPos = parameters.NodesDict.get(VsPluseDC.portPos) portNeg = parameters.NodesDict.get(VsPluseDC.portNeg) Pluse_DCValue = VsPluseDC.getVoltage(0) MatRhs[matAddr, 0] = Pluse_DCValue MatResult[portPos - 1, 0] = Pluse_DCValue if portPos != 0: MatStamps[matAddr, portPos - 1] = 1 MatStamps[portPos - 1, matAddr] = 1 if portNeg != 0: MatStamps[matAddr, portNeg - 1] = -1 MatStamps[portNeg - 1, matAddr] = -1 for elem in range(len(parameters.listSinV)): #load DC sin Vs #V -> Pluse -> SinV -> E -> F -> H -> L VsSinDC = parameters.listSinV[elem] matAddr = len(parameters.NodesDict) + len(parameters.listDCV) \ + len(parameters.listPulseV) + elem - 1 portPos = parameters.NodesDict.get(VsSinDC.portPos) portNeg = parameters.NodesDict.get(VsSinDC.portNeg) Sin_DcValue = VsSinDC.getValue(0) MatRhs[matAddr, 0] = Sin_DcValue MatResult[portPos - 1, 0] = Sin_DcValue if portPos != 0: MatStamps[matAddr, portPos - 1] = 1 MatStamps[portPos - 1, matAddr] = 1 if portNeg != 0: MatStamps[matAddr, portNeg - 1] = -1 MatStamps[portNeg - 1, matAddr] = -1 for elem in range(len(parameters.listL)): #Load L in DC simulation LTemp = parameters.listL[elem] #V -> Pluse -> SinV -> E -> F -> H -> L matAddr = len(parameters.NodesDict) + len(parameters.listDCV) \ + len(parameters.listPulseV) + len(parameters.listSinV) \ + len(parameters.listE) + len(parameters.listF) \ + 2 * len(parameters.listH) + elem - 1 portPos = parameters.NodesDict.get(LTemp.port1) portNeg = parameters.NodesDict.get(LTemp.port2) if portPos != 0: MatStamps[matAddr, portPos - 1] = 1 MatStamps[portPos - 1, matAddr] = 1 if portNeg != 0: MatStamps[matAddr, portNeg - 1] = -1 MatStamps[portNeg - 1, matAddr] = -1 for elem in parameters.listM: portD = parameters.NodesDict.get(elem.portD) portG = parameters.NodesDict.get(elem.portG) portS = parameters.NodesDict.get(elem.portS) portB = parameters.NodesDict.get(elem.portB) if portD == 0: Vd = 0 else: Vd = MatResult[portD - 1, 0] if portG == 0: Vg = 0 else: Vg = MatResult[portG - 1, 0] if portS == 0: Vs = 0 else: Vs = MatResult[portS - 1, 0] if portB == 0: #Vb = 0 pass else: #Vb = MatResult[portB-1,0] pass Vds = Vd - Vs if (elem.MosType == 'pmos'): if Vd > Vs: Vgs = Vg - Vd else: Vgs = Vg - Vs elif (elem.MosType == 'nmos'): if Vd < Vs: Vgs = Vg - Vd else: Vgs = Vg - Vs if (InitFlag): if (elem.MosType == 'pmos'): #Vds = -0.6 Vgs = -1.3 elif (elem.MosType == 'nmos'): #Vds = 0.6 Vgs = 0.5 else: pass Ids = elem.getIds(vgs=Vgs, vds=Vds) Gm = elem.getGm(vds=Vds, vgs=Vgs) Gds = elem.getGds(vds=Vds, vgs=Vgs) if portD != 0: MatRhs[portD - 1, 0] -= Ids MatStamps[portD - 1, portD - 1] += Gds if portS != 0: MatRhs[portS - 1, 0] += Ids MatStamps[portS - 1, portS - 1] += (Gds + Gm) if (portD != 0) & (portS != 0): MatStamps[portD - 1, portS - 1] -= (Gds + Gm) MatStamps[portS - 1, portD - 1] -= Gds if (portD != 0) & (portG != 0): MatStamps[portD - 1, portG - 1] += Gm if (portS != 0) & (portG != 0): MatStamps[portS - 1, portG - 1] -= Gm InitFlag = False MatResult = np.linalg.solve(MatStamps, MatRhs) #Result lastVMarkPort = VMarkPort VMarkPort = MatResult[MarkPort - 1, 0] parameters.opValueString = getOutDataOp(MatResult) else: MatStamps = np.mat(np.zeros((MatNum, MatNum))) MatRhs = np.mat(np.zeros((MatNum, 1))) for elem in parameters.listR: #Load R elem.loadMatResistor() for keyPoint in elem.StampMatDict: MatStamps[keyPoint.pointX, keyPoint.pointY] += elem.StampMatDict.get(keyPoint) for elem in range(len(parameters.listE)): #Load E #V -> Pluse -> SinV -> E -> F -> H -> L matAddr = len(parameters.NodesDict) + len(parameters.listDCV)\ + len(parameters.listPulseV) + len(parameters.listSinV) + elem - 1 parameters.listE[elem].loadMatE(matAddr) for keyPoint in parameters.listE[elem].matStampsE: MatStamps[keyPoint.pointX, keyPoint.pointY] = parameters.listE[ elem].matStampsE.get(keyPoint) for elem in range(len(parameters.listF)): #loadF #V -> Pluse -> SinV -> E -> F -> H -> L portCtlPos = parameters.NodesDict.get( parameters.listF[elem].ctlNodePos) portCtlNeg = parameters.NodesDict.get( parameters.listF[elem].ctlNodePos) matAddr = len(parameters.NodesDict) + len(parameters.listDCV) \ + len(parameters.listPulseV) + len(parameters.listSinV) \ + len(parameters.listE) + elem - 1 Vctl = MatResult[portCtlPos - 1] - MatResult[portCtlNeg - 1] parameters.listF[elem].loadMatF(matAddr, Vctl) for keyPoint in parameters.listF[elem].matStampsF: MatStamps[keyPoint.pointX, keyPoint.pointY] = parameters.listF[ elem].matStampsF.get(keyPoint) for keyPoint in parameters.listF[elem].matStampsF: MatRhs[keyPoint.pointX, keyPoint.pointY] = parameters.listF[elem].matRhsF.get( keyPoint) for elem in parameters.listG: #loadG elem.loadMatG() for keyPoint in elem.matStampsG: MatStamps[keyPoint.pointX, keyPoint.pointY] += elem.matStampsG.get(keyPoint) for elem in range(len(parameters.listH)): #load H #V -> Pluse -> SinV -> E -> F -> H -> L matAddr = len(parameters.NodesDict) + len(parameters.listDCV) \ + len(parameters.listPulseV) + len(parameters.listSinV) \ + len(parameters.listE) + len(parameters.listF) + 2 * elem - 1 portCtlPos = parameters.NodesDict.get( parameters.listH[elem].ctlNodePos) portCtlNeg = parameters.NodesDict.get( parameters.listH[elem].ctlNodePos) Vctl = MatResult[portCtlPos - 1] - MatResult[portCtlNeg - 1] parameters.listH[elem].loadMatH(matAddr, Vctl) MatRhs[matAddr + 1] = string2num( parameters.listH[elem].transResValue) for keyPoint in parameters.listH[elem].matStampsH: MatStamps[keyPoint.pointX, keyPoint.pointY] = parameters.listH[ elem].matStampsH.get(keyPoint) for elem in parameters.listDCI: #load DC Is elem.loadMatDCIs() for keyPoint in elem.RHSMatDict: MatRhs[keyPoint.pointX, keyPoint.pointY] += elem.RHSMatDict.get(keyPoint) for elem in range(len(parameters.listDCV)): #load DC Vs #V -> Pluse -> SinV -> E -> F -> H -> L VsDC = parameters.listDCV[elem] matAddr = len(parameters.NodesDict) + elem - 1 portPos = parameters.NodesDict.get(VsDC.portPos) portNeg = parameters.NodesDict.get(VsDC.portNeg) DCV_Value = string2num(VsDC.value) MatRhs[matAddr, 0] = DCV_Value if portPos != 0: MatStamps[matAddr, portPos - 1] = 1 MatStamps[portPos - 1, matAddr] = 1 if portNeg != 0: MatStamps[matAddr, portNeg - 1] = -1 MatStamps[portNeg - 1, matAddr] = -1 for elem in range(len(parameters.listPulseV)): #load DC Pluse #V -> Pluse -> SinV -> E -> F -> H -> L VsPluseDC = parameters.listPulseV[elem] matAddr = len(parameters.NodesDict) + len( parameters.listDCV) + elem - 1 portPos = parameters.NodesDict.get(VsPluseDC.portPos) portNeg = parameters.NodesDict.get(VsPluseDC.portNeg) Pluse_DCValue = VsPluseDC.getVoltage(0) MatRhs[matAddr, 0] = Pluse_DCValue if portPos != 0: MatStamps[matAddr, portPos - 1] = 1 MatStamps[portPos - 1, matAddr] = 1 if portNeg != 0: MatStamps[matAddr, portNeg - 1] = -1 MatStamps[portNeg - 1, matAddr] = -1 for elem in range(len(parameters.listSinV)): #load DC sin Vs VsSinDC = parameters.listSinV[elem] #V -> Pluse -> SinV -> E -> F -> H -> L matAddr = len(parameters.NodesDict) + len(parameters.listDCV) \ + len(parameters.listPulseV) + elem - 1 portPos = parameters.NodesDict.get(VsSinDC.portPos) portNeg = parameters.NodesDict.get(VsSinDC.portNeg) Sin_DcValue = VsSinDC.getValue(0) MatRhs[matAddr, 0] = Sin_DcValue if portPos != 0: MatStamps[matAddr, portPos - 1] = 1 MatStamps[portPos - 1, matAddr] = 1 if portNeg != 0: MatStamps[matAddr, portNeg - 1] = -1 MatStamps[portNeg - 1, matAddr] = -1 for elem in range(len(parameters.listL)): #Load L in DC simulation LTemp = parameters.listL[elem] #V -> Pluse -> SinV -> E -> F -> H -> L matAddr = len(parameters.NodesDict) + len(parameters.listDCV) \ + len(parameters.listPulseV) + len(parameters.listSinV) \ + len(parameters.listE) + len(parameters.listF) \ + 2 * len(parameters.listH) + elem - 1 portPos = parameters.NodesDict.get(LTemp.port1) portNeg = parameters.NodesDict.get(LTemp.port2) if portPos != 0: MatStamps[matAddr, portPos - 1] = 1 MatStamps[portPos - 1, matAddr] = 1 if portNeg != 0: MatStamps[matAddr, portNeg - 1] = -1 MatStamps[portNeg - 1, matAddr] = -1 MatResult = np.linalg.solve(MatStamps, MatRhs) #Result parameters.opValueString = getOutDataOp(MatResult) print('MNA:') print(MatStamps) print('RHS: ') print(MatRhs) print('Result: ') print(MatResult) print(parameters.opExpString) print(parameters.opValueString) print('-------------------------------------') showinfo('OP', 'OP Simulation End!') return MatResult
def ACSimulation(): if len(parameters.listACParam) == 0: print("Warning: No AC Simulation Parameter! ...") print('') return elif len(parameters.listACParam) == 1: print('Info: AC Simulation ...') print('') Param = parameters.listACParam[0] paramName = Param.paramName StartF = Param.paramFStart StopF = Param.paramFStop NodeNum = len(parameters.NodesDict) - 1 # Nodes but GND branchnum = len(parameters.listDCV) + len(parameters.listPulseV) + len( parameters.listSinV) + len(parameters.listE) + len( parameters.listF) + 2 * len(parameters.listH) + len( parameters.listL) #V -> Pluse -> SinV -> E -> F -> H -> L MatNum = NodeNum + branchnum MatStamps = np.mat(np.zeros((MatNum, MatNum), dtype=complex)) MatRhs = np.mat(np.zeros((MatNum, 1), dtype=complex)) MatResult = np.mat(np.zeros((MatNum, 1), dtype=complex)) MatResultFinal = np.mat(np.zeros((MatNum, 1), dtype=complex)) fileResult = open(parameters.NetlistPath + '.ac', 'w') fileResult.write('*\tAC Result\n') WriteString = getTitleAC() fileResult.write(WriteString + '\n') FreTemp = StartF while FreTemp <= StopF: if (len(parameters.listD) != 0) | (len(parameters.listM) != 0): #Unlinear Diode Devices if (len(parameters.listD) != 0): MarkPort = parameters.NodesDict.get( parameters.listD[0].port1) elif len(parameters.listM) != 0: MarkPort = parameters.NodesDict.get( parameters.listM[0].portD) else: print("Error: Logic Error!") #Wouldn't Here exit() lastVmarkPort = 1.8 VMarkPort = 0 while abs(VMarkPort - lastVmarkPort) > 0.00001: MatStamps = np.mat( np.zeros((MatNum, MatNum), dtype=complex)) MatRhs = np.mat(np.zeros((MatNum, 1), dtype=complex)) for elem in parameters.listR: #Load R elem.loadMatResistor() for keyPoint in elem.StampMatDict: MatStamps[ keyPoint.pointX, keyPoint.pointY] += elem.StampMatDict.get( keyPoint) for elem in parameters.listC: port1 = parameters.NodesDict.get(elem.port1) port2 = parameters.NodesDict.get(elem.port2) ValueC = string2num(elem.value) if port1 != 0: MatStamps[port1 - 1, port1 - 1] += 1j * ValueC * FreTemp if port2 != 0: MatStamps[port1 - 1, port2 - 1] -= 1j * ValueC * FreTemp MatStamps[port2 - 1, port1 - 1] -= 1j * ValueC * FreTemp MatStamps[port2 - 1, port2 - 1] += 1j * ValueC * FreTemp else: pass else: if port2 != 0: MatStamps[port2 - 1, port2 - 1] += 1j * ValueC * FreTemp else: pass for index in range(len(parameters.listL)): LTemp = parameters.listL[index] port1 = parameters.NodesDict.get(LTemp.port1) port2 = parameters.NodesDict.get(LTemp.port2) ValueL = string2num(LTemp.value) #V -> Pluse -> SinV -> E -> F -> H -> L matBranch = len(parameters.NodesDict) + len( parameters.listDCV) + len( parameters.listPulseV) + len( parameters.listSinV) + len( parameters.listE) + len( parameters.listF) + 2 * len( parameters.listH) + index - 1 MatStamps[matBranch, matBranch] = -1j * ValueL * FreTemp if port1 != 0: MatStamps[matBranch, port1 - 1] = 1 MatStamps[port1 - 1, matBranch] = 1 if port2 != 0: MatStamps[matBranch, port2 - 1] = -1 MatStamps[port2 - 1, matBranch] = -1 for elem in parameters.listD: #load D port1 = parameters.NodesDict.get(elem.port1) port2 = parameters.NodesDict.get(elem.port2) if (port1 != 0) & (port2 != 0): ResultVd_temp = MatResult[port1 - 1, 0] - MatResult[port2 - 1, 0] elif port1 == 0: ResultVd_temp = -1 * MatResult[port2 - 1, 0] elif port2 == 0: ResultVd_temp = MatResult[port1 - 1, 0] else: ResultVd_temp = 0 elem.loadMatDiode(ResultVd_temp) for keyPoint in elem.StampMatDict: MatStamps[ keyPoint.pointX, keyPoint.pointY] += elem.StampMatDict.get( keyPoint) for keyPoint in elem.RHSMatDict: MatRhs[keyPoint.pointX, keyPoint.pointY] += elem.RHSMatDict.get( keyPoint) for elem in range(len(parameters.listE)): #Load E #V -> Pluse -> SinV -> E -> F -> H -> L matAddr = len(parameters.NodesDict) + len( parameters.listDCV) + len( parameters.listPulseV) + len( parameters.listSinV) + elem - 1 parameters.listE[elem].loadMatE(matAddr) for keyPoint in parameters.listE[elem].matStampsE: MatStamps[keyPoint.pointX, keyPoint.pointY] = parameters.listE[ elem].matStampsE.get(keyPoint) for elem in range(len(parameters.listF)): #loadF #V -> Pluse -> SinV -> E -> F -> H -> L portCtlPos = parameters.NodesDict.get( parameters.listF[elem].ctlNodePos) portCtlNeg = parameters.NodesDict.get( parameters.listF[elem].ctlNodePos) matAddr = len(parameters.NodesDict) + len( parameters.listDCV) + len( parameters.listPulseV) + len( parameters.listSinV) + len( parameters.listE) + elem - 1 Vctl = MatResult[portCtlPos - 1] - MatResult[portCtlNeg - 1] parameters.listF[elem].loadMatF(matAddr, Vctl) for keyPoint in parameters.listF[elem].matStampsF: MatStamps[keyPoint.pointX, keyPoint.pointY] = parameters.listF[ elem].matStampsF.get(keyPoint) for keyPoint in parameters.listF[elem].matStampsF: MatRhs[keyPoint.pointX, keyPoint.pointY] = parameters.listF[ elem].matRhsF.get(keyPoint) for elem in parameters.listG: #loadG elem.loadMatG() for keyPoint in elem.matStampsG: MatStamps[keyPoint.pointX, keyPoint.pointY] += elem.matStampsG.get( keyPoint) for elem in range(len(parameters.listH)): #load H #V -> Pluse -> SinV -> E -> F -> H -> L matAddr = len(parameters.NodesDict) + len( parameters.listDCV) + len( parameters.listPulseV) + len( parameters.listSinV) + len( parameters.listE) + len( parameters.listF) + 2 * elem - 1 portCtlPos = parameters.NodesDict.get( parameters.listH[elem].ctlNodePos) portCtlNeg = parameters.NodesDict.get( parameters.listH[elem].ctlNodePos) Vctl = MatResult[portCtlPos - 1] - MatResult[portCtlNeg - 1] parameters.listH[elem].loadMatH(matAddr, Vctl) MatRhs[matAddr + 1] = string2num( parameters.listH[elem].transResValue) for keyPoint in parameters.listH[elem].matStampsH: MatStamps[keyPoint.pointX, keyPoint.pointY] = parameters.listH[ elem].matStampsH.get(keyPoint) for elem in parameters.listDCI: #load DC Is elem.loadMatDCIs() for keyPoint in elem.RHSMatDict: MatRhs[keyPoint.pointX, keyPoint.pointY] += elem.RHSMatDict.get( keyPoint) for elem in range(len(parameters.listDCV)): #load DC Vs #V -> Pluse -> SinV -> E -> F -> H -> L VsDC = parameters.listDCV[elem] matAddr = len(parameters.NodesDict) + elem - 1 portPos = parameters.NodesDict.get(VsDC.portPos) portNeg = parameters.NodesDict.get(VsDC.portNeg) DCV_Value = string2num(VsDC.value) MatRhs[matAddr, 0] = DCV_Value if portPos != 0: MatStamps[matAddr, portPos - 1] = 1 MatStamps[portPos - 1, matAddr] = 1 if portNeg != 0: MatStamps[matAddr, portNeg - 1] = -1 MatStamps[portNeg - 1, matAddr] = -1 for elem in range(len( parameters.listPulseV)): #load DC Pluse #V -> Pluse -> SinV -> E -> F -> H -> L VsPluseDC = parameters.listPulseV[elem] matAddr = len(parameters.NodesDict) + len( parameters.listDCV) + elem - 1 portPos = parameters.NodesDict.get(VsPluseDC.portPos) portNeg = parameters.NodesDict.get(VsPluseDC.portNeg) Pluse_DCValue = VsPluseDC.getVoltage(0) MatRhs[matAddr, 0] = Pluse_DCValue if portPos != 0: MatStamps[matAddr, portPos - 1] = 1 MatStamps[portPos - 1, matAddr] = 1 if portNeg != 0: MatStamps[matAddr, portNeg - 1] = -1 MatStamps[portNeg - 1, matAddr] = -1 for elem in range(len( parameters.listSinV)): #load DC sin Vs #V -> Pluse -> SinV -> E -> F -> H -> L VsSinDC = parameters.listSinV[elem] matAddr = len(parameters.NodesDict) + len( parameters.listDCV) + len( parameters.listPulseV) + elem - 1 portPos = parameters.NodesDict.get(VsSinDC.portPos) portNeg = parameters.NodesDict.get(VsSinDC.portNeg) Sin_DcValue = VsSinDC.getValue(0) MatRhs[matAddr, 0] = Sin_DcValue if portPos != 0: MatStamps[matAddr, portPos - 1] = 1 MatStamps[portPos - 1, matAddr] = 1 if portNeg != 0: MatStamps[matAddr, portNeg - 1] = -1 MatStamps[portNeg - 1, matAddr] = -1 for elem in parameters.listM: portD = parameters.NodesDict.get(elem.portD) portG = parameters.NodesDict.get(elem.portG) portS = parameters.NodesDict.get(elem.portS) portB = parameters.NodesDict.get(elem.portB) if portD == 0: Vd = 0 else: Vd = MatResult[portD - 1, 0] if portG == 0: Vg = 0 else: Vg = MatResult[portG - 1, 0] if portS == 0: Vs = 0 else: Vs = MatResult[portS - 1, 0] if portB == 0: Vb = 0 else: Vb = MatResult[portB - 1, 0] Vgs = Vg - Vs Vds = Vd - Vs Ids = elem.getIds(vgs=Vgs, vds=Vds) Gm = elem.getGm(vds=Vds, vgs=Vgs) Gds = elem.getGds(vds=Vds, vgs=Vgs) if portD != 0: MatRhs[portD - 1, 0] -= Ids MatStamps[portD - 1, portD - 1] += Gds if portS != 0: MatRhs[portS - 1, 0] += Ids MatStamps[portS - 1, portS - 1] += (Gds + Gm) if (portD != 0) & (portS != 0): MatStamps[portD - 1, portS - 1] -= (Gds + Gm) MatStamps[portS - 1, portD - 1] -= Gds if (portD != 0) & (portG != 0): MatStamps[portD - 1, portG - 1] += Gm if (portS != 0) & (portG != 0): MatStamps[portS - 1, portG - 1] -= Gm MatResult = np.linalg.solve(MatStamps, MatRhs) #Result lastVmarkPort = VMarkPort VMarkPort = MatResult[MarkPort - 1, 0] else: MatStamps = np.mat(np.zeros((MatNum, MatNum), dtype=complex)) MatRhs = np.mat(np.zeros((MatNum, 1), dtype=complex)) for elem in parameters.listR: #Load R elem.loadMatResistor() for keyPoint in elem.StampMatDict: MatStamps[keyPoint.pointX, keyPoint.pointY] += elem.StampMatDict.get( keyPoint) for elem in parameters.listC: port1 = parameters.NodesDict.get(elem.port1) port2 = parameters.NodesDict.get(elem.port2) ValueC = string2num(elem.value) if port1 != 0: MatStamps[port1 - 1, port1 - 1] += 1j * ValueC * FreTemp if port2 != 0: MatStamps[port1 - 1, port2 - 1] -= 1j * ValueC * FreTemp MatStamps[port2 - 1, port1 - 1] -= 1j * ValueC * FreTemp MatStamps[port2 - 1, port2 - 1] += 1j * ValueC * FreTemp else: pass else: if port2 != 0: MatStamps[port2 - 1, port2 - 1] += 1j * ValueC * FreTemp else: pass for index in range(len(parameters.listL)): LTemp = parameters.listL[index] port1 = parameters.NodesDict.get(LTemp.port1) port2 = parameters.NodesDict.get(LTemp.port2) ValueL = string2num(LTemp.value) #V -> Pluse -> SinV -> E -> F -> H -> L matBranch = len(parameters.NodesDict) + len( parameters.listDCV) + len(parameters.listPulseV) + len( parameters.listSinV) + len(parameters.listE) + len( parameters.listF) + 2 * len( parameters.listH) + index - 1 MatStamps[matBranch, matBranch] += -1j * ValueL * FreTemp if port1 != 0: MatStamps[matBranch, port1 - 1] = 1 MatStamps[port1 - 1, matBranch] = 1 if port2 != 0: MatStamps[matBranch, port2 - 1] = -1 MatStamps[port2 - 1, matBranch] = -1 for elem in parameters.listD: #load D port1 = parameters.NodesDict.get(elem.port1) port2 = parameters.NodesDict.get(elem.port2) if (port1 != 0) & (port2 != 0): ResultVd_temp = MatResult[port1 - 1, 0] - MatResult[port2 - 1, 0] elif port1 == 0: ResultVd_temp = -1 * MatResult[port2 - 1, 0] elif port2 == 0: ResultVd_temp = MatResult[port1 - 1, 0] else: ResultVd_temp = 0 elem.loadMatDiode(ResultVd_temp) for keyPoint in elem.StampMatDict: MatStamps[keyPoint.pointX, keyPoint.pointY] += elem.StampMatDict.get( keyPoint) for keyPoint in elem.RHSMatDict: MatRhs[keyPoint.pointX, keyPoint.pointY] += elem.RHSMatDict.get( keyPoint) for elem in range(len(parameters.listE)): #Load E #V -> Pluse -> SinV -> E -> F -> H -> L matAddr = len(parameters.NodesDict) + len( parameters.listDCV) + len(parameters.listPulseV) + len( parameters.listSinV) + elem - 1 parameters.listE[elem].loadMatE(matAddr) for keyPoint in parameters.listE[elem].matStampsE: MatStamps[keyPoint.pointX, keyPoint.pointY] = parameters.listE[ elem].matStampsE.get(keyPoint) for elem in range(len(parameters.listF)): #loadF #V -> Pluse -> SinV -> E -> F -> H -> L portCtlPos = parameters.NodesDict.get( parameters.listF[elem].ctlNodePos) portCtlNeg = parameters.NodesDict.get( parameters.listF[elem].ctlNodePos) matAddr = len(parameters.NodesDict) + len( parameters.listDCV) + len(parameters.listPulseV) + len( parameters.listSinV) + len( parameters.listE) + elem - 1 Vctl = MatResult[portCtlPos - 1] - MatResult[portCtlNeg - 1] parameters.listF[elem].loadMatF(matAddr, Vctl) for keyPoint in parameters.listF[elem].matStampsF: MatStamps[keyPoint.pointX, keyPoint.pointY] = parameters.listF[ elem].matStampsF.get(keyPoint) for keyPoint in parameters.listF[elem].matStampsF: MatRhs[keyPoint.pointX, keyPoint.pointY] = parameters.listF[ elem].matRhsF.get(keyPoint) for elem in parameters.listG: #loadG elem.loadMatG() for keyPoint in elem.matStampsG: MatStamps[keyPoint.pointX, keyPoint.pointY] += elem.matStampsG.get( keyPoint) for elem in range(len(parameters.listH)): #load H #V -> Pluse -> SinV -> E -> F -> H -> L matAddr = len(parameters.NodesDict) + len( parameters.listDCV) + len(parameters.listPulseV) + len( parameters.listSinV) + len(parameters.listE) + len( parameters.listF) + 2 * elem - 1 portCtlPos = parameters.NodesDict.get( parameters.listH[elem].ctlNodePos) portCtlNeg = parameters.NodesDict.get( parameters.listH[elem].ctlNodePos) Vctl = MatResult[portCtlPos - 1] - MatResult[portCtlNeg - 1] parameters.listH[elem].loadMatH(matAddr, Vctl) MatRhs[matAddr + 1] = string2num( parameters.listH[elem].transResValue) for keyPoint in parameters.listH[elem].matStampsH: MatStamps[keyPoint.pointX, keyPoint.pointY] = parameters.listH[ elem].matStampsH.get(keyPoint) for elem in parameters.listDCI: #load DC Is elem.loadMatDCIs() for keyPoint in elem.RHSMatDict: MatRhs[keyPoint.pointX, keyPoint.pointY] += elem.RHSMatDict.get( keyPoint) for elem in range(len(parameters.listDCV)): #load DC Vs #V -> Pluse -> SinV -> E -> F -> H -> L VsDC = parameters.listDCV[elem] matAddr = len(parameters.NodesDict) + elem - 1 portPos = parameters.NodesDict.get(VsDC.portPos) portNeg = parameters.NodesDict.get(VsDC.portNeg) DCV_Value = string2num(VsDC.value) MatRhs[matAddr, 0] = DCV_Value if portPos != 0: MatStamps[matAddr, portPos - 1] = 1 MatStamps[portPos - 1, matAddr] = 1 if portNeg != 0: MatStamps[matAddr, portNeg - 1] = -1 MatStamps[portNeg - 1, matAddr] = -1 for elem in range(len(parameters.listPulseV)): #load DC Pluse #V -> Pluse -> SinV -> E -> F -> H -> L VsPluseDC = parameters.listPulseV[elem] matAddr = len(parameters.NodesDict) + len( parameters.listDCV) + elem - 1 portPos = parameters.NodesDict.get(VsPluseDC.portPos) portNeg = parameters.NodesDict.get(VsPluseDC.portNeg) Pluse_DCValue = VsPluseDC.getVoltage(0) MatRhs[matAddr, 0] = Pluse_DCValue if portPos != 0: MatStamps[matAddr, portPos - 1] = 1 MatStamps[portPos - 1, matAddr] = 1 if portNeg != 0: MatStamps[matAddr, portNeg - 1] = -1 MatStamps[portNeg - 1, matAddr] = -1 for elem in range(len(parameters.listSinV)): #load DC sin Vs #V -> Pluse -> SinV -> E -> F -> H -> L VsSinDC = parameters.listSinV[elem] matAddr = len(parameters.NodesDict) + len( parameters.listDCV) + len( parameters.listPulseV) + elem - 1 portPos = parameters.NodesDict.get(VsSinDC.portPos) portNeg = parameters.NodesDict.get(VsSinDC.portNeg) Sin_DcValue = VsSinDC.getValue(0) MatRhs[matAddr, 0] = Sin_DcValue if portPos != 0: MatStamps[matAddr, portPos - 1] = 1 MatStamps[portPos - 1, matAddr] = 1 if portNeg != 0: MatStamps[matAddr, portNeg - 1] = -1 MatStamps[portNeg - 1, matAddr] = -1 MatResult = np.linalg.solve(MatStamps, MatRhs) #Result MatResultFinal = MatResult WriteString = str(FreTemp) + '\t' WriteString = WriteString + getDataAC(MatResultFinal) fileResult.write(WriteString + '\n') FreTemp = FreTemp * 1.05 + 1 print('Info: End AC Simulation ...') showinfo('AC End', 'End AC Simulation')
def getI(self,Vd=0): ValueGk = string2num(self.transconValue) return Vd * ValueGk
def DCSimulation(): if len(parameters.listDCParam) == 0: print("Warning: No DC Simulation Parameter!") print('') return elif len(parameters.listDCParam) == 1: print('Info: DC Simulation ...') ParamName = parameters.listDCParam[0].paramName print("Info: --Param:", ParamName) StartVal = parameters.listDCParam[0].paramValueStart StopVal = parameters.listDCParam[0].paramValueStop StepVal = parameters.listDCParam[0].paramValueStep #PiontNum = parameters.listDCParam[0].default_PointNum if ParamName in parameters.ParamDict: flagParam = True Value_Param = parameters.ParamDict.get( ParamName) #Store Origin Param Value else: parameters.ParamDict[ParamName] = StartVal flagParam = False Val_Temp = StartVal #Sweep Temp NodeNum = len(parameters.NodesDict) - 1 # Nodes but GND branchnum = len(parameters.listDCV) + len(parameters.listPulseV) + len( parameters.listSinV) + len(parameters.listE) + len( parameters.listF) + 2 * len(parameters.listH) + len( parameters.listL) #V -> Pluse -> SinV -> E -> F -> H -> L MatNum = NodeNum + branchnum MatStamps = np.mat(np.zeros((MatNum, MatNum))) MatRhs = np.mat(np.zeros((MatNum, 1))) MatResult = np.mat(np.zeros((MatNum, 1))) fileResult = open(parameters.NetlistPath + '.dc', 'w') fileResult.write('*\tDC Result\n') WriteString = getOutTitleDC() fileResult.write(WriteString + '\n') #for index in range(NodeNum): #No Load I of Voltage Source # MatResult[index,0] = parameters.opValue[index] InitFlag = True while Val_Temp <= StopVal: print(Val_Temp) parameters.ParamDict[ParamName] = Val_Temp if (len(parameters.listD) != 0) | (len(parameters.listM) != 0): #Unlinear Diode Devices if (len(parameters.listD) != 0): MarkPort = parameters.NodesDict.get( parameters.listD[0].port1) elif len(parameters.listM) != 0: MarkPort = parameters.NodesDict.get( parameters.listM[0].portD) else: print("Error: Logic Error!") #Wouldn't Here exit() lastVMarkPort = 1.8 #No Mater VMarkPort = 0.9 while abs(VMarkPort - lastVMarkPort) > 0.01: MatStamps = np.mat(np.zeros((MatNum, MatNum))) MatRhs = np.mat(np.zeros((MatNum, 1))) for elem in parameters.listR: #Load R elem.loadMatResistor() for keyPoint in elem.StampMatDict: MatStamps[ keyPoint.pointX, keyPoint.pointY] += elem.StampMatDict.get( keyPoint) for elem in parameters.listD: #load D port1 = parameters.NodesDict.get(elem.port1) port2 = parameters.NodesDict.get(elem.port2) if (port1 != 0) & (port2 != 0): ResultVd_temp = MatResult[port1 - 1, 0] - MatResult[port2 - 1, 0] elif port1 == 0: ResultVd_temp = -1 * MatResult[port2 - 1, 0] elif port2 == 0: ResultVd_temp = MatResult[port1 - 1, 0] else: ResultVd_temp = 0 elem.loadMatDiode(ResultVd_temp) for keyPoint in elem.StampMatDict: MatStamps[ keyPoint.pointX, keyPoint.pointY] += elem.StampMatDict.get( keyPoint) for keyPoint in elem.RHSMatDict: MatRhs[keyPoint.pointX, keyPoint.pointY] += elem.RHSMatDict.get( keyPoint) for elem in range(len(parameters.listE)): #Load E #V -> Pluse -> SinV -> E -> F -> H -> L matAddr = len(parameters.NodesDict) + len( parameters.listDCV) + len( parameters.listPulseV) + len( parameters.listSinV) + elem - 1 parameters.listE[elem].loadMatE(matAddr) for keyPoint in parameters.listE[elem].matStampsE: MatStamps[keyPoint.pointX, keyPoint.pointY] = parameters.listE[ elem].matStampsE.get(keyPoint) for elem in range(len(parameters.listF)): #loadF #V -> Pluse -> SinV -> E -> F -> H -> L portCtlPos = parameters.NodesDict.get( parameters.listF[elem].ctlNodePos) portCtlNeg = parameters.NodesDict.get( parameters.listF[elem].ctlNodePos) matAddr = len(parameters.NodesDict) + len( parameters.listDCV) + len( parameters.listPulseV) + len( parameters.listSinV) + len( parameters.listE) + elem - 1 Vctl = MatResult[portCtlPos - 1] - MatResult[portCtlNeg - 1] parameters.listF[elem].loadMatF(matAddr, Vctl) for keyPoint in parameters.listF[elem].matStampsF: MatStamps[keyPoint.pointX, keyPoint.pointY] = parameters.listF[ elem].matStampsF.get(keyPoint) for keyPoint in parameters.listF[elem].matStampsF: MatRhs[keyPoint.pointX, keyPoint.pointY] = parameters.listF[ elem].matRhsF.get(keyPoint) for elem in parameters.listG: #loadG elem.loadMatG() for keyPoint in elem.matStampsG: MatStamps[keyPoint.pointX, keyPoint.pointY] += elem.matStampsG.get( keyPoint) for elem in range(len(parameters.listH)): #load H #V -> Pluse -> SinV -> E -> F -> H -> L matAddr = len(parameters.NodesDict) + len( parameters.listDCV) + len( parameters.listPulseV) + len( parameters.listSinV) + len( parameters.listE) + len( parameters.listF) + 2 * elem - 1 portCtlPos = parameters.NodesDict.get( parameters.listH[elem].ctlNodePos) portCtlNeg = parameters.NodesDict.get( parameters.listH[elem].ctlNodePos) Vctl = MatResult[portCtlPos - 1] - MatResult[portCtlNeg - 1] parameters.listH[elem].loadMatH(matAddr, Vctl) MatRhs[matAddr + 1] = string2num( parameters.listH[elem].transResValue) for keyPoint in parameters.listH[elem].matStampsH: MatStamps[keyPoint.pointX, keyPoint.pointY] = parameters.listH[ elem].matStampsH.get(keyPoint) for elem in parameters.listDCI: #load DC Is elem.loadMatDCIs() for keyPoint in elem.RHSMatDict: MatRhs[keyPoint.pointX, keyPoint.pointY] += elem.RHSMatDict.get( keyPoint) for elem in range(len(parameters.listDCV)): #load DC Vs #V -> Pluse -> SinV -> E -> F -> H -> L VsDC = parameters.listDCV[elem] matAddr = len(parameters.NodesDict) + elem - 1 portPos = parameters.NodesDict.get(VsDC.portPos) portNeg = parameters.NodesDict.get(VsDC.portNeg) DCV_Value = string2num(VsDC.value) MatRhs[matAddr, 0] = DCV_Value if portPos != 0: MatStamps[matAddr, portPos - 1] = 1 MatStamps[portPos - 1, matAddr] = 1 if portNeg != 0: MatStamps[matAddr, portNeg - 1] = -1 MatStamps[portNeg - 1, matAddr] = -1 for elem in range(len( parameters.listPulseV)): #load DC Pluse #V -> Pluse -> SinV -> E -> F -> H -> L VsPluseDC = parameters.listPulseV[elem] matAddr = len(parameters.NodesDict) + len( parameters.listDCV) + elem - 1 portPos = parameters.NodesDict.get(VsPluseDC.portPos) portNeg = parameters.NodesDict.get(VsPluseDC.portNeg) Pluse_DCValue = VsPluseDC.getVoltage(0) MatRhs[matAddr, 0] = Pluse_DCValue if portPos != 0: MatStamps[matAddr, portPos - 1] = 1 MatStamps[portPos - 1, matAddr] = 1 if portNeg != 0: MatStamps[matAddr, portNeg - 1] = -1 MatStamps[portNeg - 1, matAddr] = -1 for elem in range(len( parameters.listSinV)): #load DC sin Vs #V -> Pluse -> SinV -> E -> F -> H -> L VsSinDC = parameters.listSinV[elem] matAddr = len(parameters.NodesDict) + len( parameters.listDCV) + len( parameters.listPulseV) + elem - 1 portPos = parameters.NodesDict.get(VsSinDC.portPos) portNeg = parameters.NodesDict.get(VsSinDC.portNeg) Sin_DcValue = VsSinDC.getValue(0) MatRhs[matAddr, 0] = Sin_DcValue if portPos != 0: MatStamps[matAddr, portPos - 1] = 1 MatStamps[portPos - 1, matAddr] = 1 if portNeg != 0: MatStamps[matAddr, portNeg - 1] = -1 MatStamps[portNeg - 1, matAddr] = -1 for elem in range(len( parameters.listL)): #Load L in DC simulation LTemp = parameters.listL[elem] #V -> Pluse -> SinV -> E -> F -> H -> L matAddr = len(parameters.NodesDict) + len( parameters.listDCV) + len( parameters.listPulseV) + len( parameters.listSinV) + len( parameters.listE) + len( parameters.listF) + 2 * len( parameters.listH) + elem - 1 portPos = parameters.NodesDict.get(LTemp.port1) portNeg = parameters.NodesDict.get(LTemp, port2) if portPos != 0: MatStamps[matAddr, portPos - 1] = 1 MatStamps[portPos - 1, matAddr] = 1 if portNeg != 0: MatStamps[matAddr, portNeg - 1] = -1 MatStamps[portNeg - 1, matAddr] = -1 for elem in parameters.listM: portD = parameters.NodesDict.get(elem.portD) portG = parameters.NodesDict.get(elem.portG) portS = parameters.NodesDict.get(elem.portS) portB = parameters.NodesDict.get(elem.portB) if portD == 0: Vd = 0 else: Vd = MatResult[portD - 1, 0] if portG == 0: Vg = 0 else: Vg = MatResult[portG - 1, 0] if portS == 0: Vs = 0 else: Vs = MatResult[portS - 1, 0] if portB == 0: pass #Vb = 0 else: pass #Vb = MatResult[portB-1,0] Vds = Vd - Vs if (elem.MosType == 'pmos'): if Vd > Vs: Vgs = Vg - Vd else: Vgs = Vg - Vs elif (elem.MosType == 'nmos'): if Vd < Vs: Vgs = Vg - Vd else: Vgs = Vg - Vs if (InitFlag): if (elem.MosType == 'pmos'): #Vds = -1.3 Vgs = -1.3 elif (elem.MosType == 'nmos'): #Vds = 0.6 Vgs = 0.5 else: pass Ids = elem.getIds(vgs=Vgs, vds=Vds) Gm = elem.getGm(vds=Vds, vgs=Vgs) Gds = elem.getGds(vds=Vds, vgs=Vgs) if portD != 0: MatRhs[portD - 1, 0] -= Ids MatStamps[portD - 1, portD - 1] += Gds if portS != 0: MatRhs[portS - 1, 0] += Ids MatStamps[portS - 1, portS - 1] += (Gds + Gm) if (portD != 0) & (portS != 0): MatStamps[portD - 1, portS - 1] -= (Gds + Gm) MatStamps[portS - 1, portD - 1] -= Gds if (portD != 0) & (portG != 0): MatStamps[portD - 1, portG - 1] += Gm if (portS != 0) & (portG != 0): MatStamps[portS - 1, portG - 1] -= Gm InitFlag = False MatResult = np.linalg.solve(MatStamps, MatRhs) #Result lastVMarkPort = VMarkPort VMarkPort = MatResult[MarkPort - 1, 0] else: MatStamps = np.mat(np.zeros((MatNum, MatNum))) MatRhs = np.mat(np.zeros((MatNum, 1))) for elem in parameters.listR: #Load R elem.loadMatResistor() for keyPoint in elem.StampMatDict: MatStamps[keyPoint.pointX, keyPoint.pointY] += elem.StampMatDict.get( keyPoint) for elem in range(len(parameters.listE)): #Load E #V -> Pluse -> SinV -> E -> F -> H -> L matAddr = len(parameters.NodesDict) + len( parameters.listDCV) + len(parameters.listPulseV) + len( parameters.listSinV) + elem - 1 parameters.listE[elem].loadMatE(matAddr) for keyPoint in parameters.listE[elem].matStampsE: MatStamps[keyPoint.pointX, keyPoint.pointY] = parameters.listE[ elem].matStampsE.get(keyPoint) for elem in range(len(parameters.listF)): #loadF #V -> Pluse -> SinV -> E -> F -> H -> L portCtlPos = parameters.NodesDict.get( parameters.listF[elem].ctlNodePos) portCtlNeg = parameters.NodesDict.get( parameters.listF[elem].ctlNodePos) matAddr = len(parameters.NodesDict) + len( parameters.listDCV) + len(parameters.listPulseV) + len( parameters.listSinV) + len( parameters.listE) + elem - 1 Vctl = MatResult[portCtlPos - 1] - MatResult[portCtlNeg - 1] parameters.listF[elem].loadMatF(matAddr, Vctl) for keyPoint in parameters.listF[elem].matStampsF: MatStamps[keyPoint.pointX, keyPoint.pointY] = parameters.listF[ elem].matStampsF.get(keyPoint) for keyPoint in parameters.listF[elem].matStampsF: MatRhs[keyPoint.pointX, keyPoint.pointY] = parameters.listF[ elem].matRhsF.get(keyPoint) for elem in parameters.listG: #loadG elem.loadMatG() for keyPoint in elem.matStampsG: MatStamps[keyPoint.pointX, keyPoint.pointY] += elem.matStampsG.get( keyPoint) for elem in range(len(parameters.listH)): #load H #V -> Pluse -> SinV -> E -> F -> H -> L matAddr = len(parameters.NodesDict) + len( parameters.listDCV) + len(parameters.listPulseV) + len( parameters.listSinV) + len(parameters.listE) + len( parameters.listF) + 2 * elem - 1 portCtlPos = parameters.NodesDict.get( parameters.listH[elem].ctlNodePos) portCtlNeg = parameters.NodesDict.get( parameters.listH[elem].ctlNodePos) Vctl = MatResult[portCtlPos - 1] - MatResult[portCtlNeg - 1] parameters.listH[elem].loadMatH(matAddr, Vctl) MatRhs[matAddr + 1] = string2num( parameters.listH[elem].transResValue) for keyPoint in parameters.listH[elem].matStampsH: MatStamps[keyPoint.pointX, keyPoint.pointY] = parameters.listH[ elem].matStampsH.get(keyPoint) for elem in parameters.listDCI: #load DC Is elem.loadMatDCIs() for keyPoint in elem.RHSMatDict: MatRhs[keyPoint.pointX, keyPoint.pointY] += elem.RHSMatDict.get( keyPoint) for elem in range(len(parameters.listDCV)): #load DC Vs #V -> Pluse -> SinV -> E -> F -> H -> L VsDC = parameters.listDCV[elem] matAddr = len(parameters.NodesDict) + elem - 1 portPos = parameters.NodesDict.get(VsDC.portPos) portNeg = parameters.NodesDict.get(VsDC.portNeg) DCV_Value = string2num(VsDC.value) MatRhs[matAddr, 0] = DCV_Value if portPos != 0: MatStamps[matAddr, portPos - 1] = 1 MatStamps[portPos - 1, matAddr] = 1 if portNeg != 0: MatStamps[matAddr, portNeg - 1] = -1 MatStamps[portNeg - 1, matAddr] = -1 for elem in range(len(parameters.listPulseV)): #load DC Pluse #V -> Pluse -> SinV -> E -> F -> H -> L VsPluseDC = parameters.listPulseV[elem] matAddr = len(parameters.NodesDict) + len( parameters.listDCV) + elem - 1 portPos = parameters.NodesDict.get(VsPluseDC.portPos) portNeg = parameters.NodesDict.get(VsPluseDC.portNeg) Pluse_DCValue = VsPluseDC.getVoltage(0) MatRhs[matAddr, 0] = Pluse_DCValue if portPos != 0: MatStamps[matAddr, portPos - 1] = 1 MatStamps[portPos - 1, matAddr] = 1 if portNeg != 0: MatStamps[matAddr, portNeg - 1] = -1 MatStamps[portNeg - 1, matAddr] = -1 for elem in range(len(parameters.listSinV)): #load DC sin Vs #V -> Pluse -> SinV -> E -> F -> H -> L VsSinDC = parameters.listSinV[elem] matAddr = len(parameters.NodesDict) + len( parameters.listDCV) + len( parameters.listPulseV) + elem - 1 portPos = parameters.NodesDict.get(VsSinDC.portPos) portNeg = parameters.NodesDict.get(VsSinDC.portNeg) Sin_DcValue = VsSinDC.getValue(0) MatRhs[matAddr, 0] = Sin_DcValue if portPos != 0: MatStamps[matAddr, portPos - 1] = 1 MatStamps[portPos - 1, matAddr] = 1 if portNeg != 0: MatStamps[matAddr, portNeg - 1] = -1 MatStamps[portNeg - 1, matAddr] = -1 for elem in range(len( parameters.listL)): #Load L in DC simulation LTemp = parameters.listL[elem] #V -> Pluse -> SinV -> E -> F -> H -> L matAddr = len(parameters.NodesDict) + len( parameters.listDCV) + len(parameters.listPulseV) + len( parameters.listSinV) + len(parameters.listE) + len( parameters.listF) + 2 * len( parameters.listH) + elem - 1 portPos = parameters.NodesDict.get(LTemp.port1) portNeg = parameters.NodesDict.get(LTemp.port2) if portPos != 0: MatStamps[matAddr, portPos - 1] = 1 MatStamps[portPos - 1, matAddr] = 1 if portNeg != 0: MatStamps[matAddr, portNeg - 1] = -1 MatStamps[portNeg - 1, matAddr] = -1 MatResult = np.linalg.solve(MatStamps, MatRhs) #Result WriteString = str(Val_Temp) + '\t' WriteString = WriteString + getOutDataDC(MatResult) fileResult.write(WriteString + '\n') Val_Temp = Val_Temp + StepVal if flagParam: parameters.ParamDict[ParamName] = Value_Param fileResult.close() print('Info: End DC Simulation ...') elif len(parameters.listDCParam) == 2: print("Info: SWEEP:", parameters.listDCParam[0].paramName, parameters.listDCParam[1].paramName) else: print("Error: Error Expression of DC Simulation") showinfo('DC', 'DC Simulation End!')
def getDCCurrent(self): DCCurrent = string2num(self.value) return DCCurrent
def TranSimulation(): if len(parameters.listTranParam) == 0: return elif len(parameters.listTranParam) == 1: print('Info: Tran Simulation ...') TranParamTime = parameters.listTranParam[0] StepTime = TranParamTime.StepTime StopTime = TranParamTime.StopTime TranUIC = TranParamTime.UIC StartTime = TranParamTime.StartTime TimeTemp = StartTime NodeNum = len(parameters.NodesDict) - 1 branchNum = len(parameters.listDCV) + len(parameters.listPulseV) + len(parameters.listSinV) + len(parameters.listE) + len(parameters.listF) + 2 * len(parameters.listH) + len(parameters.listL) #V -> Pluse -> SinV -> E -> F -> H -> L MatNum = NodeNum + branchNum #Mat Col or Row Number MatStamps = np.mat(np.zeros((MatNum,MatNum))) MatRhs = np.mat(np.zeros((MatNum,1))) MatResult = np.mat(np.zeros((MatNum,1))) MatResultFinal = np.mat(np.zeros((MatNum,1))) #Unlinear For Final fileResult = open(parameters.NetlistPath+'.tr','w') fileResult.write('*\tTran Simulation Result\n') WriteString = getOutTitleTran() fileResult.write(WriteString + '\n') #for index in range(NodeNum): #No Load I of Voltage Source # MatResult[index,0] = parameters.opValue[index] InitFlag = True while TimeTemp <= StopTime: if (len(parameters.listD) != 0) | (len(parameters.listM) != 0): #Unlinear Diode Devices if (len(parameters.listD)!=0): MarkPort = parameters.NodesDict.get(parameters.listD[0].port1) elif len(parameters.listM) != 0: MarkPort = parameters.NodesDict.get(parameters.listM[0].portD) else: print("Error: Logic Error!") #Wouldn't Here return lastVMarkPort = 1.8 #No Mater VMarkPort = 0.9 while abs(VMarkPort - lastVMarkPort) > 0.00001: MatStamps = np.mat(np.zeros((MatNum,MatNum))) MatRhs = np.mat(np.zeros((MatNum,1))) for elem in parameters.listR: #Load R elem.loadMatResistor() for keyPoint in elem.StampMatDict: MatStamps[keyPoint.pointX,keyPoint.pointY] += elem.StampMatDict.get(keyPoint) for elem in parameters.listC: #NA port1 = parameters.NodesDict.get(elem.port1) port2 = parameters.NodesDict.get(elem.port2) ValueC = string2num(elem.value) CDIVStep = ValueC / StepTime if port1 != 0: MatStamps[port1-1,port1-1] += CDIVStep if port2 != 0: MatStamps[port1-1,port2-1] -= CDIVStep MatStamps[port2-1,port1-1] -= CDIVStep MatStamps[port2-1,port2-1] += CDIVStep VoltageCLast = MatResultFinal[port1-1,0] - MatResultFinal[port2-1,0] MatRhs[port1-1,0] += CDIVStep * VoltageCLast MatRhs[port2-1,0] -= CDIVStep * VoltageCLast else: VoltageCLast = MatResultFinal[port1-1,0] MatRhs[port1-1,0] += CDIVStep * VoltageCLast else: if port2 != 0: MatStamps[port2-1,port2-1] += CDIVStep VoltageCLast = -1 * MatResultFinal[port2-1,0] MatRhs[port2-1,0] -= CDIVStep * VoltageCLast else: VoltageCLast = 0 for elem in range(len(parameters.listL)): #Load L LTemp = parameters.listL[elem] port1 = parameters.NodesDict.get(LTemp.port1) port2 = parameters.NodesDict.get(LTemp.port2) ValueL = string2num(LTemp.value) LDIVStep = ValueL/StepTime #V -> Pluse -> SinV -> E -> F -> H -> L matBranch = len(parameters.NodesDict) + len(parameters.listDCV) + len(parameters.listPulseV) + len(parameters.listSinV) + len(parameters.listE) + len(parameters.listF) + 2 * len(parameters.listH) + elem - 1 MatStamps[matBranch,matBranch] = -1 * LDIVStep iLLast = MatResultFinal[matBranch,0] MatRhs[matBranch,0] = -1 * MatStamps * iLLast if port1 != 0: MatStamps[matBranch,port1-1] = 1 MatStamps[port1-1,matBranch] = 1 if port2 != 0: MatStamps[matBranch,port2-1] = -1 MatStamps[port2-1,matBranch] = -1 for elem in parameters.listD: #load D port1 = parameters.NodesDict.get(elem.port1) port2 = parameters.NodesDict.get(elem.port2) if (port1 != 0) & (port2 != 0): ResultVd_temp = MatResult[port1-1,0] - MatResult[port2-1,0] elif port1 == 0: ResultVd_temp = -1 * MatResult[port2-1,0] elif port2 == 0: ResultVd_temp = MatResult[port1-1,0] else: ResultVd_temp = 0 elem.loadMatDiode(ResultVd_temp) for keyPoint in elem.StampMatDict: MatStamps[keyPoint.pointX,keyPoint.pointY] += elem.StampMatDict.get(keyPoint) for keyPoint in elem.RHSMatDict: MatRhs[keyPoint.pointX,keyPoint.pointY] += elem.RHSMatDict.get(keyPoint) for elem in range(len(parameters.listE)): #Load E #V -> Pluse -> SinV -> E -> F -> H -> L matAddr = len(parameters.NodesDict) + len(parameters.listDCV) + len(parameters.listPulseV) + len(parameters.listSinV) + elem - 1 parameters.listE[elem].loadMatE(matAddr) for keyPoint in parameters.listE[elem].matStampsE: MatStamps[keyPoint.pointX,keyPoint.pointY] = parameters.listE[elem].matStampsE.get(keyPoint) for elem in range(len(parameters.listF)): #loadF #V -> Pluse -> SinV -> E -> F -> H -> L portCtlPos = parameters.NodesDict.get(parameters.listF[elem].ctlNodePos) portCtlNeg = parameters.NodesDict.get(parameters.listF[elem].ctlNodePos) matAddr = len(parameters.NodesDict) + len(parameters.listDCV) + len(parameters.listPulseV) + len(parameters.listSinV) + len(parameters.listE) + elem - 1 Vctl = MatResult[portCtlPos-1] - MatResult[portCtlNeg-1] parameters.listF[elem].loadMatF(matAddr,Vctl) for keyPoint in parameters.listF[elem].matStampsF: MatStamps[keyPoint.pointX,keyPoint.pointY] = parameters.listF[elem].matStampsF.get(keyPoint) for keyPoint in parameters.listF[elem].matStampsF: MatRhs[keyPoint.pointX,keyPoint.pointY] = parameters.listF[elem].matRhsF.get(keyPoint) for elem in parameters.listG: #loadG elem.loadMatG() for keyPoint in elem.matStampsG: MatStamps[keyPoint.pointX,keyPoint.pointY] += elem.matStampsG.get(keyPoint) for elem in range(len(parameters.listH)): #load H #V -> Pluse -> SinV -> E -> F -> H -> L matAddr = len(parameters.NodesDict) + len(parameters.listDCV) + len(parameters.listPulseV) + len(parameters.listSinV) + len(parameters.listE) + len(parameters.listF) + 2 * elem - 1 portCtlPos = parameters.NodesDict.get(parameters.listH[elem].ctlNodePos) portCtlNeg = parameters.NodesDict.get(parameters.listH[elem].ctlNodePos) Vctl = MatResult[portCtlPos-1] - MatResult[portCtlNeg-1] parameters.listH[elem].loadMatH(matAddr,Vctl) MatRhs[matAddr+1] = string2num(parameters.listH[elem].transResValue) for keyPoint in parameters.listH[elem].matStampsH: MatStamps[keyPoint.pointX,keyPoint.pointY] = parameters.listH[elem].matStampsH.get(keyPoint) for elem in parameters.listDCI: #load DC Is elem.loadMatDCIs() for keyPoint in elem.RHSMatDict: MatRhs[keyPoint.pointX,keyPoint.pointY] += elem.RHSMatDict.get(keyPoint) for elem in range(len(parameters.listDCV)): #load DC Vs #V -> Pluse -> SinV -> E -> F -> H -> L VsDC = parameters.listDCV[elem] matAddr = len(parameters.NodesDict) + elem - 1 portPos = parameters.NodesDict.get(VsDC.portPos) portNeg = parameters.NodesDict.get(VsDC.portNeg) DCV_Value = string2num(VsDC.value) MatRhs[matAddr,0] = DCV_Value MatResult[portPos-1,0] = DCV_Value if portPos != 0: MatStamps[matAddr,portPos-1] = 1 MatStamps[portPos-1,matAddr] = 1 if portNeg != 0: MatStamps[matAddr,portNeg-1] = -1 MatStamps[portNeg-1,matAddr] = -1 for elem in range(len(parameters.listPulseV)): #load DC Pluse #V -> Pluse -> SinV -> E -> F -> H -> L VsPluseDC = parameters.listPulseV[elem] matAddr = len(parameters.NodesDict) + len(parameters.listDCV) + elem - 1 portPos = parameters.NodesDict.get(VsPluseDC.portPos) portNeg = parameters.NodesDict.get(VsPluseDC.portNeg) Pluse_DCValue = VsPluseDC.getVoltage(TimeTemp) MatRhs[matAddr,0] = Pluse_DCValue MatResult[portPos-1,0] = Pluse_DCValue print(Pluse_DCValue) if portPos != 0: MatStamps[matAddr,portPos-1] = 1 MatStamps[portPos-1,matAddr] = 1 if portNeg != 0: MatStamps[matAddr,portNeg-1] = -1 MatStamps[portNeg-1,matAddr] = -1 for elem in range(len(parameters.listSinV)): #load DC sin Vs #V -> Pluse -> SinV -> E -> F -> H -> L VsSinDC = parameters.listSinV[elem] matAddr = len(parameters.NodesDict) + len(parameters.listDCV) + len(parameters.listPulseV) + elem - 1 portPos = parameters.NodesDict.get(VsSinDC.portPos) portNeg = parameters.NodesDict.get(VsSinDC.portNeg) Sin_DcValue = VsSinDC.getValue(TimeTemp) MatRhs[matAddr,0] = Sin_DcValue MatResult[portPos-1,0] = Sin_DcValue if portPos != 0: MatStamps[matAddr,portPos-1] = 1 MatStamps[portPos-1,matAddr] = 1 if portNeg != 0: MatStamps[matAddr,portNeg-1] = -1 MatStamps[portNeg-1,matAddr] = -1 for elem in parameters.listM: portD = parameters.NodesDict.get(elem.portD) portG = parameters.NodesDict.get(elem.portG) portS = parameters.NodesDict.get(elem.portS) portB = parameters.NodesDict.get(elem.portB) if portD == 0: Vd = 0 else: Vd = MatResult[portD-1,0] if portG == 0: Vg = 0 else: Vg = MatResult[portG-1,0] if portS == 0: Vs = 0 else: Vs = MatResult[portS-1,0] if portB == 0: pass #Vb = 0 else: pass #Vb = MatResult[portB-1,0] Vds = Vd - Vs if(elem.MosType == 'pmos'): if Vd > Vs: Vgs = Vg-Vd else: Vgs = Vg-Vs elif(elem.MosType == 'nmos'): if Vd < Vs: Vgs = Vg-Vd else: Vgs = Vg-Vs if (InitFlag) : if (elem.MosType == 'pmos'): #Vds = -0.6 Vgs = -1.2 elif (elem.MosType == 'nmos'): #Vds = 0.6 Vgs = 0.5 else: pass Ids = elem.getIds(vgs=Vgs,vds=Vds) Gm = elem.getGm(vds=Vds,vgs=Vgs) Gds = elem.getGds(vds=Vds,vgs=Vgs) if portD != 0: MatRhs[portD-1,0] -= Ids MatStamps[portD-1,portD-1] += Gds if portS != 0: MatRhs[portS-1,0] += Ids MatStamps[portS-1,portS-1] += (Gds + Gm) if (portD!=0) & (portS!=0): MatStamps[portD-1,portS-1] -= (Gds + Gm) MatStamps[portS-1,portD-1] -= Gds if (portD!=0) & (portG!=0): MatStamps[portD-1,portG-1] += Gm if (portS!=0) & (portG!=0): MatStamps[portS-1,portG-1] -= Gm InitFlag = False MatResult = np.linalg.solve(MatStamps,MatRhs) #Result lastVMarkPort = VMarkPort VMarkPort = MatResult[MarkPort-1,0] else: MatStamps = np.mat(np.zeros((MatNum,MatNum))) MatRhs = np.mat(np.zeros((MatNum,1))) for elem in parameters.listR: #Load R elem.loadMatResistor() for keyPoint in elem.StampMatDict: MatStamps[keyPoint.pointX,keyPoint.pointY] += elem.StampMatDict.get(keyPoint) for elem in parameters.listC: #NA port1 = parameters.NodesDict.get(elem.port1) port2 = parameters.NodesDict.get(elem.port2) ValueC = string2num(elem.value) CDIVStep = ValueC / StepTime if port1 != 0: MatStamps[port1-1,port1-1] += CDIVStep if port2 != 0: MatStamps[port1-1,port2-1] -= CDIVStep MatStamps[port2-1,port1-1] -= CDIVStep MatStamps[port2-1,port2-1] += CDIVStep VoltageCLast = MatResultFinal[port1-1,0] - MatResultFinal[port2-1,0] MatRhs[port1-1,0] += CDIVStep * VoltageCLast MatRhs[port2-1,0] -= CDIVStep * VoltageCLast else: VoltageCLast = MatResultFinal[port1-1,0] MatRhs[port1-1,0] += CDIVStep * VoltageCLast else: if port2 != 0: MatStamps[port2-1,port2-1] += CDIVStep VoltageCLast = -1 * MatResultFinal[port2-1,0] MatRhs[port2-1,0] -= CDIVStep * VoltageCLast else: VoltageCLast = 0 for elem in range(len(parameters.listL)): #Load L LTemp = parameters.listL[elem] port1 = parameters.NodesDict.get(LTemp.port1) port2 = parameters.NodesDict.get(LTemp.port2) ValueL = string2num(LTemp.value) LDIVStep = ValueL/StepTime #V -> Pluse -> SinV -> E -> F -> H -> L matBranch = len(parameters.NodesDict) + len(parameters.listDCV) + len(parameters.listPulseV) + len(parameters.listSinV) + len(parameters.listE) + len(parameters.listF) + 2 * len(parameters.listH) + elem - 1 MatStamps[matBranch,matBranch] = -1 * LDIVStep iLLast = MatResultFinal[matBranch,0] MatRhs[matBranch,0] = -1 * LDIVStep * iLLast if port1 != 0: MatStamps[matBranch,port1-1] = 1 MatStamps[port1-1,matBranch] = 1 if port2 != 0: MatStamps[matBranch,port2-1] = -1 MatStamps[port2-1,matBranch] = -1 for elem in range(len(parameters.listE)): #Load E #V -> Pluse -> SinV -> E -> F -> H -> L matAddr = len(parameters.NodesDict) + len(parameters.listDCV) + len(parameters.listPulseV) + len(parameters.listSinV) + elem - 1 parameters.listE[elem].loadMatE(matAddr) for keyPoint in parameters.listE[elem].matStampsE: MatStamps[keyPoint.pointX,keyPoint.pointY] = parameters.listE[elem].matStampsE.get(keyPoint) for elem in range(len(parameters.listF)): #loadF #V -> Pluse -> SinV -> E -> F -> H -> L portCtlPos = parameters.NodesDict.get(parameters.listF[elem].ctlNodePos) portCtlNeg = parameters.NodesDict.get(parameters.listF[elem].ctlNodePos) matAddr = len(parameters.NodesDict) + len(parameters.listDCV) + len(parameters.listPulseV) + len(parameters.listSinV) + len(parameters.listE) + elem - 1 Vctl = MatResult[portCtlPos-1] - MatResult[portCtlNeg-1] parameters.listF[elem].loadMatF(matAddr,Vctl) for keyPoint in parameters.listF[elem].matStampsF: MatStamps[keyPoint.pointX,keyPoint.pointY] = parameters.listF[elem].matStampsF.get(keyPoint) for keyPoint in parameters.listF[elem].matStampsF: MatRhs[keyPoint.pointX,keyPoint.pointY] = parameters.listF[elem].matRhsF.get(keyPoint) for elem in parameters.listG: #loadG elem.loadMatG() for keyPoint in elem.matStampsG: MatStamps[keyPoint.pointX,keyPoint.pointY] += elem.matStampsG.get(keyPoint) for elem in range(len(parameters.listH)): #load H #V -> Pluse -> SinV -> E -> F -> H -> L matAddr = len(parameters.NodesDict) + len(parameters.listDCV) + len(parameters.listPulseV) + len(parameters.listSinV) + len(parameters.listE) + len(parameters.listF) + 2 * elem - 1 portCtlPos = parameters.NodesDict.get(parameters.listH[elem].ctlNodePos) portCtlNeg = parameters.NodesDict.get(parameters.listH[elem].ctlNodePos) Vctl = MatResult[portCtlPos-1] - MatResult[portCtlNeg-1] parameters.listH[elem].loadMatH(matAddr,Vctl) MatRhs[matAddr+1] = string2num(parameters.listH[elem].transResValue) for keyPoint in parameters.listH[elem].matStampsH: MatStamps[keyPoint.pointX,keyPoint.pointY] = parameters.listH[elem].matStampsH.get(keyPoint) for elem in parameters.listDCI: #load DC Is elem.loadMatDCIs() for keyPoint in elem.RHSMatDict: MatRhs[keyPoint.pointX,keyPoint.pointY] += elem.RHSMatDict.get(keyPoint) for elem in range(len(parameters.listDCV)): #load DC Vs #V -> Pluse -> SinV -> E -> F -> H -> L VsDC = parameters.listDCV[elem] matAddr = len(parameters.NodesDict) + elem - 1 portPos = parameters.NodesDict.get(VsDC.portPos) portNeg = parameters.NodesDict.get(VsDC.portNeg) DCV_Value = string2num(VsDC.value) MatRhs[matAddr,0] = DCV_Value if portPos != 0: MatStamps[matAddr,portPos-1] = 1 MatStamps[portPos-1,matAddr] = 1 if portNeg != 0: MatStamps[matAddr,portNeg-1] = -1 MatStamps[portNeg-1,matAddr] = -1 for elem in range(len(parameters.listPulseV)): #load DC Pluse #V -> Pluse -> SinV -> E -> F -> H -> L VsPluseDC = parameters.listPulseV[elem] matAddr = len(parameters.NodesDict) + len(parameters.listDCV) + elem - 1 portPos = parameters.NodesDict.get(VsPluseDC.portPos) portNeg = parameters.NodesDict.get(VsPluseDC.portNeg) Pluse_DCValue = VsPluseDC.getVoltage(TimeTemp) MatRhs[matAddr,0] = Pluse_DCValue if portPos != 0: MatStamps[matAddr,portPos-1] = 1 MatStamps[portPos-1,matAddr] = 1 if portNeg != 0: MatStamps[matAddr,portNeg-1] = -1 MatStamps[portNeg-1,matAddr] = -1 for elem in range(len(parameters.listSinV)): #load DC sin Vs #V -> Pluse -> SinV -> E -> F -> H -> L VsSinDC = parameters.listSinV[elem] matAddr = len(parameters.NodesDict) + len(parameters.listDCV) + len(parameters.listPulseV) + elem - 1 portPos = parameters.NodesDict.get(VsSinDC.portPos) portNeg = parameters.NodesDict.get(VsSinDC.portNeg) Sin_DcValue = VsSinDC.getValue(TimeTemp) MatRhs[matAddr,0] = Sin_DcValue if portPos != 0: MatStamps[matAddr,portPos-1] = 1 MatStamps[portPos-1,matAddr] = 1 if portNeg != 0: MatStamps[matAddr,portNeg-1] = -1 MatStamps[portNeg-1,matAddr] = -1 for elem in range(len(parameters.listL)): #Load L in DC simulation LTemp = parameters.listL[elem] #V -> Pluse -> SinV -> E -> F -> H -> L matAddr = len(parameters.NodesDict) + len(parameters.listDCV) + len(parameters.listPulseV) + len(parameters.listSinV) + len(parameters.listE) + len(parameters.listF) + 2 * len(parameters.listH) + elem - 1 portPos = parameters.NodesDict.get(LTemp.port1) portNeg = parameters.NodesDict.get(LTemp,port2) if portPos != 0: MatStamps[matAddr,portPos-1] = 1 MatStamps[portPos-1,matAddr] = 1 if portNeg != 0: MatStamps[matAddr,portNeg-1] = -1 MatStamps[portNeg-1,matAddr] = -1 MatResult = np.linalg.solve(MatStamps,MatRhs) #Result MatResultFinal = MatResult WriteString = str(TimeTemp) + '\t' WriteString = WriteString + getOutDataTran(MatResultFinal) fileResult.write(WriteString + '\n') TimeTemp = TimeTemp + StepTime print('Info: End Tran Simulation ...') else : print('Error: More Than One Param!') showinfo('Tran','Tran Simulation End!')
def getIds(self, vgs=0.0, vds=0.0): if self.MosType == 'nmos': width = string2num(self.valueW) length = string2num(self.valueL) kn = string2num(self.kn) Vt0 = string2num(self.Vt0n) lambdaN = string2num(self.lambdaN) Vgt = float(vgs - Vt0) Beta = kn / 2.0 * (width / length) gm = self.getGm(vds=vds, vgs=vgs) gds = self.getGds(vds=vds, vgs=vgs) if (vgs <= Vt0): Ids = 0 elif (vds >= 0) & (vds <= Vgt): Ids = Beta * (2.0 * Vgt * vds - vds * vds) * ( 1.0 + lambdaN * vds) - gds * vds - gm * vgs elif (vds >= 0) & (vds > Vgt): Ids = Beta * (Vgt * Vgt) * (1 + lambdaN * vds) - gds * vds - gm * vgs elif (vds < 0) & ((-1 * vds) <= Vgt): Ids = -1 * Beta * (-2 * Vgt * vds - vds * vds) * ( 1 - lambdaN * vds) - gds * vds - gm * vgs elif (vds < 0) & ((-1 * vds) > Vgt): Ids = -1 * Beta * (Vgt * Vgt) * ( 1 - lambdaN * vds) - gds * vds - gm * vgs else: print("Error: Error logic NMosFet Vds!") exit() elif self.MosType == 'pmos': width = string2num(self.valueW) length = string2num(self.valueL) kp = string2num(self.kp) Vt0 = string2num(self.Vt0p) lambdaP = string2num(self.lambdaP) Vgt = vgs - Vt0 Beta = kp / 2.0 * (width / length) gm = self.getGm(vds=vds, vgs=vgs) gds = self.getGds(vds=vds, vgs=vgs) # if (vds <= 0) & (vds >= Vgt): # Ids = Beta * (2.0 * Vgt * vds - vds*vds) * (1.0 + lambdaP * vds) - gds * vds - gm*vgs # elif vds < Vgt: # Ids = Beta * (Vgt*Vgt) * (1 + lambdaP * vds) - gds * vds - gm*vgs # else: # Ids = Beta * (2.0 * Vgt * vds - vds*vds) - gds * vds - gm*vgs if vgs >= Vt0: Ids = 0.0 elif (vds <= 0) & (vds >= Vgt): Ids = Beta * (2.0 * Vgt * vds - vds * vds) * ( 1.0 + lambdaP * vds) - gds * vds - gm * vgs elif (vds <= 0) & (vds < Vgt): Ids = Beta * (Vgt * Vgt) * (1 + lambdaP * vds) - gds * vds - gm * vgs elif (vds > 0) & ((-1 * vds) >= Vgt): Ids = -1 * Beta * (-2 * Vgt * vds - vds * vds) * ( 1 - lambdaP * vds) - gds * vds - gm * vgs elif (vds > 0) & ((-1 * vds) < Vgt): Ids = -1 * Beta * (Vgt**2) * ( 1 - lambdaP * vds) - gds * vds - gm * vgs else: #wouldn't Here print("Error: Error logic PMosFet Vds!") exit() else: print("Error: Error Mos Type!", self.MosType) exit() return Ids
def getGds(self, vds=0.0, vgs=0.0): if self.MosType == 'nmos': width = string2num(self.valueW) length = string2num(self.valueL) kn = string2num(self.kn) Vt0 = string2num(self.Vt0n) lambdaN = string2num(self.lambdaN) Vgt = vgs - Vt0 Beta = kn / 2.0 * (width / length) if vgs <= Vt0: gds = 0 elif (vds >= 0) & (vds <= Vgt): gds = Beta * (2 * Vgt - vds * 2) * ( 1 + lambdaN * vds) + Beta * (2 * Vgt * vds - vds * vds) * lambdaN elif (vds >= 0) & (vds > Vgt): gds = Beta * (Vgt * Vgt) * lambdaN elif (vds < 0) & ((-1 * vds) <= Vgt): gds = -1 * Beta * (-2 * Vgt - vds * 2) * ( 1 - lambdaN * vds) + 1 * Beta * (-2 * Vgt * vds - vds**2) * (lambdaN) elif (vds < 0) & ((-1 * vds) > Vgt): gds = Beta * (Vgt * Vgt) * lambdaN else: #wouldn't Here print("Error: GetGds-- Error logic NMosFet Vds!") elif self.MosType == 'pmos': width = string2num(self.valueW) length = string2num(self.valueL) kp = string2num(self.kp) Vt0 = string2num(self.Vt0p) lambdaP = string2num(self.lambdaP) Vgt = vgs - Vt0 Beta = kp / 2.0 * (width / length) # if (vds <= 0) & (vds >= Vgt): # gds = Beta * (2 * Vgt - vds * 2) * (1 + lambdaP * vds) + Beta * (2 * Vgt * vds - vds**2) * lambdaP # elif vds < Vgt: # gds = Beta * (Vgt**2) * lambdaP # else: # gds = 2.0 * Beta * (Vgt - vds) if vgs >= Vt0: gds = 0 elif (vds <= 0) & (vds >= Vgt): gds = Beta * (2 * Vgt - vds * 2) * ( 1 + lambdaP * vds) + Beta * (2 * Vgt * vds - vds**2) * lambdaP elif (vds <= 0) & (vds < Vgt): gds = Beta * (Vgt**2) * lambdaP elif (vds > 0) & ((-1 * vds) >= Vgt): gds = -1 * Beta * (-2 * Vgt - vds * 2) * ( 1 - lambdaP * vds) + 1 * Beta * (-2 * Vgt * vds - vds**2) * (lambdaP) elif (vds > 0) & ((-1 * vds) < Vgt): gds = Beta * (Vgt**2) * lambdaP else: #wouldn't Here print("Error: GetGds-- Error logic MosFet Vds!") else: print("Error: Error Mos Type!", self.MosType) exit() return gds
def getGm(self, vds=0, vgs=0): gm = 0.00001 if self.MosType == 'nmos': width = string2num(self.valueW) length = string2num(self.valueL) kn = string2num(self.kn) Vt0 = string2num(self.Vt0n) lambdaN = string2num(self.lambdaN) Vgt = vgs - Vt0 Beta = kn / 2.0 * (width / length) if vgs <= Vt0: gm = 0 elif (vds >= 0) & (vds <= Vgt): gm = 2 * Beta * vds * (1 + lambdaN * vds) elif (vds >= 0) & (vds > Vgt): gm = 2 * Beta * Vgt * (1 + lambdaN * vds) elif (vds < 0) & ((-1 * vds) <= Vgt): gm = 2 * Beta * vds * (1 - lambdaN * vds) elif (vds < 0) & ((-1 * vds) > Vgt): gm = -2 * Beta * Vgt * (1 - lambdaN * vds) else: #wouldn't Here print("Error: GetGm-- Error logic NMosFet Vds!") elif self.MosType == 'pmos': width = string2num(self.valueW) length = string2num(self.valueL) kp = string2num(self.kp) Vt0 = string2num(self.Vt0p) lambdaP = string2num(self.lambdaP) Vgt = vgs - Vt0 Beta = kp / 2.0 * (width / length) # if (vds <= 0) & (vds >= Vgt): # gm = 2.0 * Beta * vds * (1.0 + lambdaP * vds) # elif vds < Vgt: # gm = 2 * Beta * Vgt * (1 + lambdaP * vds) # else: # gm = 2.0 * Beta * vds if vgs >= Vt0: gm = 0 elif (vds <= 0) & (vds >= Vgt): gm = 2.0 * Beta * vds * (1.0 + lambdaP * vds) elif (vds <= 0) & (vds < Vgt): gm = 2 * Beta * Vgt * (1 + lambdaP * vds) elif (vds > 0) & ((-1 * vds) >= Vgt): gm = 2 * Beta * vds * (1 - lambdaP * vds) elif (vds > 0) & ((-1 * vds) < Vgt): gm = -2 * Beta * Vgt * (1 - lambdaP * vds) else: #wouldn't Here print("Error: GetGm-- Error logic MosFet Vds!") exit() else: print("Error: Error Mos Type!", self.MosType) exit() return gm