Exemplo n.º 1
0
def test_bugs():
	"""Test bugfixes."""
	
	cct = eispice.Circuit('Break-Point Stall Bug')
	cct.Vx = eispice.V('vs',0, 0, 
			eispice.Pulse(0, 1, '0n','1n','1n','4n','8n'))
	cct.Rt = eispice.R('vs', 'vi', 50)
	cct.Tg = eispice.T('vi', 0, 'vo', 0, 50, '2n')
	cct.Cx = eispice.C('vo',0,'5p')
	cct.tran('0.01n', '18n')
	eispice.plot(cct)
	
	cct = eispice.Circuit("LC Tline Bug")
	cct.Vs = eispice.V('vs', 0, 0, 
			eispice.Pulse(0, 1, '15n', '1n', '1n', '5n', '50n'))
	cct.Rs = eispice.R('vs', 1, 50)
	for i in range(1,100):
		setattr(cct,"L%i"%i,eispice.L(i,i+1,"2n"))
		setattr(cct,"C%i"%i,eispice.C(i+1,0,"1p"))
	cct.Rl = eispice.R(i+1, 0, 50)
	cct.tran('0.1n', '200n')
	eispice.plot_voltage(cct, 1 ,'%i' % (i+1))

	cct = eispice.Circuit("SuperLU Hangup Bug")
	cct.Vx = eispice.V('1', '0', 4, 
			eispice.Pulse(4, 8, '10n', '2n', '3n', '5n', '20n'))
	cct.Vy = eispice.V('1', '0', 4, 
			eispice.Pulse(8, 4, '10n', '2n', '3n', '5n', '20n'))
	cct.tran('0.5n', '100n')
	eispice.plot(cct)
Exemplo n.º 2
0
 def generateSpiceModel(self):
     self.spiceModel = [] #clear the spiceModel
     #setting up singel battery spice model
     for i in range(self.length-1):# in order to set the last battery sepratedly we should have self.length-1 here
         Vsp = ('V'+str(i),eispice.V(self[i].pNode,self[i].nNode,self[i].voltage))#eispice source model
         Rsp = ('iR'+str(i),eispice.R(self[i].nNode,self[i+1].pNode,self[i].intR))#eispice resistance model
         self.spiceModel.append(Vsp)
         self.spiceModel.append(Rsp) #set a signel battery spice model
         if self[i].balanceRate != 0.0:
             Rsb=('balance_'+ self[i].name,eispice.R(self[i].pNode,self[i+1].pNode, 1.0 * self.balanceResVal / self[i].balanceRate))
             self.spiceModel.append(Rsb)            
             
     # set the spice model for the last battery
     Vsp = ('V'+str(self.length-1),eispice.V(self[self.length-1].pNode,self[self.length-1].nNode,self[self.length-1].voltage))
     Rsp = ('iR'+str(self.length-1),eispice.R(self[self.length-1].nNode,self.nNode,self[self.length-1].intR))
     self.spiceModel.append(Vsp)
     self.spiceModel.append(Rsp)
     if self[self.length-1].balanceRate != 0.0:
          Rsb=('balance_'+ self[self.length-1].name,eispice.R(self[self.length-1].pNode,self.nNode, 1.0 * self.balanceResVal / self[self.length-1].balanceRate))
          self.spiceModel.append(Rsb) 
            
     for i in range(self.length):
         #self.voltageList[i] = round(self[i].voltage,3)
         #self.quantityList[i] = round(self[i].quantity,3)
         self.voltageList[i] = self[i].voltage
         self.quantityList[i] =self[i].quantity
         self.socList[i]  = round(self[i].soc,1)
         self.cyclesList[i]  = self[i].cycles
     self.totalCurrent=self[0].current
     self.totalVoltage=sum(self.voltageList)
     #having a new list to store all the battery spice models
     return self.spiceModel
Exemplo n.º 3
0
def circuit():
    cir = eispice.Circuit("Mixed Mode Test")
    #cir.Vx = eispice.V(1,0,4)
    cir.L = eispice.L(1, 0, 27e-9)
    cir.R = eispice.R(1, 0, 820)
    cir.C = eispice.C(1, 0, 47e-12)
    cir.Rout = eispice.R(2, 0, 100)
    cir.TriggerOut = EispicePort(1, 0, triggerout, eispice.Current)
    cir.DetectorOut = EispicePort(2, 0, detectorout, eispice.Voltage)
    return cir
Exemplo n.º 4
0
 def __init__(self, pNode, nNode, batteryDescriptor):
     '''
     Arguments:
     pNode -- positive node name
     nNode -- negative node name
     parameterDict -- dictionary to describe the battery
     The following keys should be included:
     batteryDescriptor.Name = 'cell'
     batteryDescriptor.OCVParameter = OCV_SOC_Parameters
     batteryDescriptor.InnerR =  0.021
     batteryDescriptor.R1 = 0.045
     batteryDescriptor.C1 = 300
     batteryDescriptor.R2 = None
     batteryDescriptor.C2 = None
     batteryDescriptor.InitialSOC = 0.99
     batteryDescriptor.Capacity = 5300
     batteryDescriptor.OCVCallback = some call back function
     batteryDescriptor.BalanceResCallBack = None #if it's not None, then a balance resistance will be added.
         
     OCVParameter -- K0~K4 parameter of OCV-SOC relation
     InnerR -- Inner resistance of the battery
     R1,C1 -- R and C value of first order dynamic model
     '''
     name = batteryDescriptor.Name
     if batteryDescriptor.R2 is not None and batteryDescriptor.C2 is not None:
         self.C2 = [('C2_' + name,
                     eispice.C('@nc2_' + name, pNode,
                               batteryDescriptor.C2))]
         self.R2 = [('R2_' + name,
                     eispice.R(pNode, '@nc2_' + name,
                               batteryDescriptor.R2))]
         self.C1 = [('C1_' + name,
                     eispice.C('@nc1_' + name, '@nc2_' + name,
                               batteryDescriptor.C1))]
         self.R1 = [('R1_' + name,
                     eispice.R('@nc2_' + name, '@nc1_' + name,
                               batteryDescriptor.R1))]
     else:
         self.C1 = [('C1_' + name,
                     eispice.C('@nc1_' + name, pNode,
                               batteryDescriptor.C1))]
         self.R1 = [('R1_' + name,
                     eispice.R(pNode, '@nc1_' + name,
                               batteryDescriptor.R1))]
     self.iR = [('iR_' + name,
                 eispice.R('@nc0_' + name, '@nc1_' + name,
                           batteryDescriptor.InnerR))]
     self.ocv = [('OCV_' + name,
                  OCV('@nc0_' + name, nNode, batteryDescriptor.OCVParameter,
                      batteryDescriptor.InitialSOC,
                      batteryDescriptor.Capacity, 'OCV_' + name,
                      batteryDescriptor.OCVCallback))]
     if batteryDescriptor.BalanceResCallBack is not None:
         self.balanceR = customizedCurrentSource(
             pNode, nNode, batteryDescriptor.BalanceResCallBack)
Exemplo n.º 5
0
 def discharge(self, time, saveStatus=True):
     totalQuantity = 0
     totalSOC = 0
     f = open('dischargeData.txt', 'a')
     cct = eispice.Circuit("battery stimulator discharge")
     cct.batteries = self.bg.generateSpiceModel()
     #it will return a list contains connected batteries
     cct.load = eispice.R(self.bg.pNode, self.bg.nNode,
                          self.load)  # put the load on
     cct.tran('0.01n', '0.02n')  #doing transient analysis
     for i in range(self.NumberOfCells * self.NumberOfStacks):
         self.bg[i].current = abs(cct.i['V' + str(i)]('0.01n')) * 1000
         self.bg[i].quantity -= self.bg[i].current * time / 3600
         self.bg[i].soc = self.bg[i].quantity / self.BATTERYCAPACITY
         totalQuantity += self.bg[i].quantity
     #print 'the total quantity is:',totalQuantity
     totalSOC = totalQuantity / (self.BATTERYCAPACITY * self.NumberOfCells *
                                 self.NumberOfStacks)
     self.clock += time
     f.write(str(self.clock) + '\t')
     f.write(str(totalSOC) + '\t')
     f.write('\n')
     f.close()
     if saveStatus:
         self.backup()  # save current status
     self.updateInfo()
Exemplo n.º 6
0
def generateSpiceModel():
    spiceModel = []

    Vsp = ('Vsp', eispice.V('V1+', eispice.GND, 3.65))  #eispice source model
    Rsp = ('Rsp', eispice.R('V1+', 'V2-', 0.0155))  #eispice resistance model
    Rb = ('Rb', eispice.R('V2-', eispice.GND, 240))

    Vsp2 = ('Vsp2', eispice.V('V2-', 'V2+', 3.65))
    Rsp2 = ('Rsp2', eispice.R('V2+', 'V3-', 0.0155))
    Rb2 = ('Rb2', eispice.R('V2-', 'V3-', 240))

    Vsp3 = ('Vsp3', eispice.V('V3-', 'V3+', 3.65))
    Rsp3 = ('Rsp3', eispice.R('V3+', 'V4-', 0.0155))
    Rb3 = ('Rb3', eispice.R('V3-', 'V4-', 240))

    load = ('load', eispice.R('V4-', eispice.GND, 1000))

    spiceModel.append(Vsp)
    spiceModel.append(Rsp)  #set a signel battery spice model
    spiceModel.append(Rb)

    spiceModel.append(Vsp2)
    spiceModel.append(Rsp2)
    spiceModel.append(Rb2)

    spiceModel.append(Vsp3)
    spiceModel.append(Rsp3)
    spiceModel.append(Rb3)

    spiceModel.append(load)
    return spiceModel
Exemplo n.º 7
0
    def run(self):
        global eispice_finished
        cir = eispice.Circuit("Mixed Mode Test")
        ### here we do the analog circuit description ###
        cir.L = eispice.L(1, 0, 27e-9)
        cir.R = eispice.R(1, 0, 820)
        cir.C = eispice.C(1, 0, 47e-12)
        cir.Rout = eispice.R(2, 0, 100)

        ### now we define our two MyHDL ports ###
        cir.TriggerOut = EispicePort(1, 0, triggerout, eispice.Current)
        cir.DetectorOut = EispicePort(2, 0, detectorout, eispice.Voltage)

        ### starting the simulation ###
        cir.tran(myhdl_timestep, simulationlen)

        ### plotting the results ###
        eispice.plot(cir)
        print "Eispice Simulation finished"
        catchup.set()
        eispice_finished = 1
Exemplo n.º 8
0
 def chargeNdischarge(self,time,saveStatus = True ):        
     cct = eispice.Circuit("battery stimulator charge")
     cct.batteries = self.bg.generateSpiceModel();
     cct.source = eispice.I(self.bg.pNode,self.bg.nNode,self.source)# constant current charge source
     cct.load = eispice.R(self.bg.pNode,self.bg.nNode,self.load)# put the load on
     cct.tran('0.01n','0.02n')#doing transient analysis 
     for i in range(self.NumberOfCells*self.NumberOfStacks):
         self.bg[i].current=cct.i['V'+str(i)]('0.01n')*1000    
         self.bg[i].quantity += self.bg[i].current * time /3600
         print('current:{0},  quantity Gain:{1}'.format(self.bg[i].current,self.bg[i].qGain))
     if saveStatus:
          self.backup() # save current status
     self.updateInfo()
Exemplo n.º 9
0
    def generateSpiceModel(self):
        self.spiceModel = []  #clear the spiceModel
        #setting up singel battery spice model
        for i in range(
                self.length - 1
        ):  # in order to set the last battery sepratedly we should have self.length-1 here
            Vsp = ('V' + str(i),
                   eispice.V(self[i].pNode, self[i].nNode,
                             self[i].voltage))  #eispice source model
            Rsp = ('iR' + str(i),
                   eispice.R(self[i].nNode, self[i + 1].pNode,
                             self[i].intR))  #eispice resistance model
            self.spiceModel.append(Vsp)
            self.spiceModel.append(Rsp)  #set a signel battery spice model

        # set the spice model for the last battery
        Vsp = ('V' + str(self.length - 1),
               eispice.V(self[self.length - 1].pNode,
                         self[self.length - 1].nNode,
                         self[self.length - 1].voltage))
        Rsp = ('iR' + str(self.length - 1),
               eispice.R(self[self.length - 1].nNode, self.nNode,
                         self[self.length - 1].intR))
        self.spiceModel.append(Vsp)
        self.spiceModel.append(Rsp)

        for b in self:
            if b.balanceRate != 0.0:
                Rsb = ('balance_' + b.name,
                       eispice.R(b.pNode, b.intR,
                                 1.0 * self.balanceResVal / b.balanceRate))
                self.spiceModel.append(Rsb)

        for i in range(self.length):
            self.voltageList[i] = round(self[i].voltage, 3)

        return self.spiceModel
Exemplo n.º 10
0
    def NdischargeNCharge(self, time, saveStatus=True):
        #calculate the current
        cct = eispice.Circuit("battery stimulator not discharge not charge")
        cct.batteries = self.bg.generateSpiceModel()
        #it will return a list contains connected batteries
        cct.load = eispice.R(self.bg.pNode, self.bg.nNode, 10000000)
        cct.tran('0.01n', '0.02n')  #doing transient analysis
        for i in range(self.NumberOfCells * self.NumberOfStacks):
            print cct.i['V' + str(i)]('0.01n')
            self.bg.current = self.bg.current + abs(
                cct.i['V' + str(i)]('0.01n'))
        print self.bg.current

        qLoss = self.bg.current * time
        for b in self.bg:
            b.quantity = b.quantity - qLoss
        print('current:{0},  quantity loss:{1}'.format(self.bg.current, qLoss))
Exemplo n.º 11
0
def test_ibis():
	"""Extended eispice.Ibis Model Testing
	NOTE: Will only work on my development tree, these models are copyrighted
	and can not be distributed with eispice. CE
	"""
	
	# 29le010.ibs
	ibs = eispice.Ibis("../development/29le010.ibs")
	cct = eispice.Circuit('test_29le010')
	cct.Driver = ibs['17']('vs')
	cct.Tg = eispice.T('vs', 0, 'vo', 0, 75, '10n')
	cct.Receiver = ibs['2']('vo')
	cct.tran('0.1n', '5n')
	eispice.plot(cct)

	# 39wf800a.ibs
	ibs = eispice.Ibis("../development/39wf800a.ibs")
	cct = eispice.Circuit('test_39wf800a')
	cct.Driver = ibs['e2']('vs')
	cct.Tg = eispice.T('vs', 0, 'vo', 0, 100, '10n')
	cct.Receiver = ibs['a1']('vo')
	cct.tran('0.1n', '5n')
	eispice.plot(cct)

	# ad9222bcp.ibs
	ibs = eispice.Ibis("../development/ad9222bcp.ibs")
	cct = eispice.Circuit('test_ad9222bcp')
	cct.Driver = ibs['39']('vs')
	cct.Tg = eispice.T('vs', 0, 'vo', 0, 50, '10n')
	cct.Receiver = ibs['38']('vs')
	cct.tran('0.1n', '200n')
	eispice.plot(cct)
	
	# ad9289bbc.ibs
	ibs = eispice.Ibis("../development/ad9289bbc.ibs")
	cct = eispice.Circuit('test_ad9289bbc')
	cct.DriverP = ibs['b1']('vsp')
	cct.DriverN = ibs['b1']('vsn', direction=eispice.Falling)
	cct.Rl = eispice.R('vsp',0,50)
	cct.R2 = eispice.R('vsn',0,50)
	cct.tran('0.1n', '10n')
	eispice.plot(cct)
	
	# ahc1g14.ibs
	ibs = eispice.Ibis("../development/ahc1g14.ibs")
	cct = eispice.Circuit('test_ahc1g14')
	cct.Driver = ibs['4']('vx', modelName='ahc_xgouti_50')
	cct.Rl = eispice.R('vx','vs',33.2)
	cct.Tg = eispice.T('vs', 0, 'vo', 0, 50, '10n')
	cct.Receiver = ibs['2']('vs', modelName='ahc_xg14in_50')
	cct.tran('0.1n', '50n')
	eispice.plot(cct)

	# alvc00m_300.ibs
	ibs = eispice.Ibis("../development/alvc00m_300.ibs")
	cct = eispice.Circuit('test_alvc00m_300')
	cct.Driver = ibs['3']('vx')
	cct.Rl = eispice.R('vx','vs',33.2)
	cct.Tg = eispice.T('vs', 0, 'vo', 0, 50, '10n')
	cct.Receiver = ibs['1']('vs')
	cct.tran('0.1n', '50n')
	eispice.plot(cct)

	# au1000.ibs
	ibs = eispice.Ibis("../development/au1000.ibs")
	cct = eispice.Circuit('test_au1000')
	cct.Driver = ibs['A1']('vx')
	cct.Rl = eispice.R('vx','vs',33.2)
	cct.Tg = eispice.T('vs', 0, 'vo', 0, 50, '10n')
	cct.Receiver = ibs['A10']('vs')
	cct.tran('0.1n', '50n')
	eispice.plot(cct)
Exemplo n.º 12
0
import eispice
ibs = eispice.Ibis('test')
cct = eispice.Circuit('IBIS Test')
cct.Driver = ibs['2']('vs')
cct.Rt = eispice.R('vs', 'vi', 33.2)
cct.Tg = eispice.T('vi', 0, 'vo', 0, 50, '2n')
cct.Receiver = ibs['1']('vo')
cct.tran('0.01n', '20n')
eispice.plot(cct)
Exemplo n.º 13
0
import eispice

cct = eispice.Circuit("battery stimulator not discharge not charge")
cct.Vsource1 = eispice.V('V1+', eispice.GND, 3.65)
cct.intR1 = eispice.R('V1+', 'intR1', 0.0155)
cct.balanceR1 = eispice.R('intR1', eispice.GND, 240)

cct.tran('0.01n', '0.02n')
print 'current of Vsource1 is:', cct.i['Vsource1']('0.01n')  #unit is A
print 'voltage of V1+ is:', cct.v['V1+']('0.01n')  #unit is V