Example #1
0
 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
Example #2
0
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()
Example #3
0
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 ''
Example #4
0
	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
Example #5
0
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
Example #6
0
    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()
Example #8
0
	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
Example #9
0
	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		
Example #10
0
	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
Example #11
0
	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
Example #12
0
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 ''
Example #13
0
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
Example #14
0
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
Example #15
0
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')
Example #16
0
	def getI(self,Vd=0):
		ValueGk = string2num(self.transconValue)
		return Vd * ValueGk
Example #17
0
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!')
Example #18
0
	def getDCCurrent(self):
		DCCurrent = string2num(self.value)
		return DCCurrent
Example #19
0
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!')
Example #20
0
    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
Example #21
0
    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
Example #22
0
    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