{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**TODO**\n",
"- just the general stuff"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"WARNING: KICAD_SYMBOL_DIR environment variable is missing, so the default KiCad symbol libraries won't be searched.\n"
]
}
],
"source": [
"#Library import statements\n",
"\n",
"from skidl.pyspice import *\n",
"#can you say cheeky \n",
"import PySpice as pspice\n",
"#becouse it's written by a kiwi you know\n",
"import lcapy as kiwi\n",
"\n",
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import warnings\n",
"\n",
"from IPython.display import YouTubeVideo, display\n",
"\n",
"import traceback"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"application/json": {
"Software versions": [
{
"module": "Python",
"version": "3.7.6 64bit [GCC 7.3.0]"
},
{
"module": "IPython",
"version": "7.12.0"
},
{
"module": "OS",
"version": "Linux 4.19.104 microsoft standard x86_64 with debian bullseye sid"
},
{
"module": "skidl",
"version": "0.0.31.dev0"
},
{
"module": "PySpice",
"version": "1.4.3"
},
{
"module": "lcapy",
"version": "0.75.dev0"
},
{
"module": "sympy",
"version": "1.6.2"
},
{
"module": "numpy",
"version": "1.18.1"
},
{
"module": "matplotlib",
"version": "3.3.0"
},
{
"module": "pandas",
"version": "1.1.4"
},
{
"module": "scipy",
"version": "1.4.1"
}
]
},
"text/html": [
"
Software
Version
Python
3.7.6 64bit [GCC 7.3.0]
IPython
7.12.0
OS
Linux 4.19.104 microsoft standard x86_64 with debian bullseye sid
skidl
0.0.31.dev0
PySpice
1.4.3
lcapy
0.75.dev0
sympy
1.6.2
numpy
1.18.1
matplotlib
3.3.0
pandas
1.1.4
scipy
1.4.1
Mon Jan 18 15:30:57 2021 MST
"
],
"text/latex": [
"\\begin{tabular}{|l|l|}\\hline\n",
"{\\bf Software} & {\\bf Version} \\\\ \\hline\\hline\n",
"Python & 3.7.6 64bit [GCC 7.3.0] \\\\ \\hline\n",
"IPython & 7.12.0 \\\\ \\hline\n",
"OS & Linux 4.19.104 microsoft standard x86\\_64 with debian bullseye sid \\\\ \\hline\n",
"skidl & 0.0.31.dev0 \\\\ \\hline\n",
"PySpice & 1.4.3 \\\\ \\hline\n",
"lcapy & 0.75.dev0 \\\\ \\hline\n",
"sympy & 1.6.2 \\\\ \\hline\n",
"numpy & 1.18.1 \\\\ \\hline\n",
"matplotlib & 3.3.0 \\\\ \\hline\n",
"pandas & 1.1.4 \\\\ \\hline\n",
"scipy & 1.4.1 \\\\ \\hline\n",
"\\hline \\multicolumn{2}{|l|}{Mon Jan 18 15:30:57 2021 MST} \\\\ \\hline\n",
"\\end{tabular}\n"
],
"text/plain": [
"Software versions\n",
"Python 3.7.6 64bit [GCC 7.3.0]\n",
"IPython 7.12.0\n",
"OS Linux 4.19.104 microsoft standard x86_64 with debian bullseye sid\n",
"skidl 0.0.31.dev0\n",
"PySpice 1.4.3\n",
"lcapy 0.75.dev0\n",
"sympy 1.6.2\n",
"numpy 1.18.1\n",
"matplotlib 3.3.0\n",
"pandas 1.1.4\n",
"scipy 1.4.1\n",
"Mon Jan 18 15:30:57 2021 MST"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#notebook specific loading control statements \n",
"%matplotlib inline\n",
"#tool to log notebook internals\n",
"#https://github.com/jrjohansson/version_information\n",
"%load_ext version_information\n",
"%version_information skidl, PySpice,lcapy, sympy, numpy, matplotlib, pandas, scipy"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"from DC_1_Codes import get_skidl_spice_ref"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# DC Sweeps \n",
"In the last two sections, we worked with SPICE operating point analysis (.op) which just gives us static values for everything in the circuit. While this is handy for getting values it's not really that useful. What is more useful is seeing some kind of \"dynamic\" response of the circuit. If you know anything about SPICE you might be thinking of Transient simulations, but that is to come. Right now we want to look at the DC response of the circuit to some swept value in the circuit. To do this we use the DC simulation in ngspice (`.dc`) to shift the value of one of the elements in the circuit. Technically as of writing this ngspice (vs33) ` .dc` can sweep two values at the same time but the results are interlaced results and it's just worth doing when we can pay a slight speed penalty for using python tools like xarray to look for relations resulting from N number of individual variable sweeps. (Also as of the time of writing this pyspice will not sweep anything other than voltage and current sources, this is on my list of things to fix since ngspice by its self can sweep more than just voltage and current sources)\n",
"\n",
"To illustrate DC sweeps and also to present SKiDl's subcircuit feature (more on that below) we look at Ideal vs Non-Ideal sources response to load effects. The example circuits are based on the examples from ALL ABOUT ELECTRONICS \"Ideal Voltage Source vs. Practical Voltage Source\" and “Ideal Current Source vs. Practical Current Source” that gives a good review of ideal vs non-ideal sources\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/jpeg": "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EQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREH//2Q==\n",
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\n",
"YouTubeVideo('TRzpqHwb-5Y', width=500, height=400, start=306)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/jpeg": "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99NyYXg5yPRHloH6tP72PcK+Wcfq0/vf/oLztzkn6kXZf305yT9SLsv76bkwvBzkeiPLOP1af3se4WMuug5HZw4bXRtW825+sCDMheeucs/Ui7L++pzkn6kXZf319jRcKP7OcjvWO4tPenfZsv5SZ+Q9DWNGezHG39CNufD1niSSvwrqfOSfqRdl/fTnJP1Iuy/vqzoppop6NPCB2z0IV1PnJP1Iuy/vpzln6sXZf316HbFF1TnJP1Iuy/vpzkn6sXZf30Hawg4LqnOSfqRdl/fTnJP1Yuy/voO1t+9F1PnHP1Iuy/vq845+rF2X99B2tAV1TnHP1Yuy/vqDSOfqRdl/fQdsCq6nzkn6sXZf305yT9WLsv76DtoUd9oXU+ck/Ui7L++nOSfqRdl/fQdrcVcl1M6ST9SLsv76c5J+rF2X99B2zpVK6nzkn6kXZf305yz9SHsv76DthRdT5yz9SLsv76c5Z+pD2X99B2xCup85Z+pF2X99Ock/Ui7L++g4RERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREH//Z\n",
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#@~5min\n",
"YouTubeVideo('dTf1h_xhHng', width=500, height=400, start=173)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# DC load sweep of an Ideal Voltage source\n",
"\n",
"So the first thing is we create a circuit just like we would for an operating point simulation previously. And even though we are going to be sweeping values in our elements we must give all elements initial values, even if they're not in our sweep range."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
".title \n",
"V_vs N_1 0 30V\n",
"Idload N_1 0 1A\n",
"\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n",
"No errors or warnings found during netlist generation.\n",
"\n"
]
}
],
"source": [
"reset()\n",
"vs=V(ref='_vs', dc_value=30@u_V)\n",
"\n",
"dummy_load=I(ref='dload', dc_value=1@u_A)\n",
"\n",
"gnd & vs['n', 'p'] & dummy_load['p', 'n'] & gnd\n",
"circ=generate_netlist()\n",
"print(circ)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The next thing we do is create a pyspice simulation object just like we would do for an operating point analysis to give us access to ngspice and from which we call the DC simulation from. In the following cell, we invoke the .dc simulation on the second line. The general syntax for which is\n",
"```\n",
".dc(=slice(, , ))\n",
"```\n",
".dc is the method call and it uses pythons kwargs to accepts the SPICE netlist element full reference that we intend to sweep. So that in this case we are sweeping `dummy_load` as our current draw on the voltage source, and its netlist entry is `Idload`. So we pass Idload as the keyword argument to `.dc`. Then we set the value of the argument using pythons' built-in `slice` function. If you have never used it before it's a way of setting list indexing to a variable and in this case, passing list indexing through a stack. Here is a quick example that you can see `slice` in action for yourself\n",
"\n",
"```\n",
"a_array=np.linspace(0, 100)\n",
"a_slice=slice(8, 15, 3) #start at item 8, up to item 15, by 3 items\n",
"(a_array[8:15:3]==a_array[a_slice]).all()\n",
"```\n",
"Back to doing a `.dc` sim, we want to sweep our load dummy_load that will draw from 0A up to 1000A (not including) with a step size of 0.1A and see what effect it has on the source. So our code will be\n",
"\n",
"```\n",
"dc_vals=sim.dc(Idload=slice(0, 1000, 0.1))\n",
"```\n",
"where `dc_vals` is just the simulation results, just like an operating point analysis.\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"sim=circ.simulator()\n",
"dc_vals=sim.dc(Idload=slice(0, 10, 0.1))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Our results are accessed just like the results of an operating point analysis expect two things. One we get arrays of results for each item measured instead of just a float. Though we could get a single value if we set the .dc to only capture one point. And secondly, we have a new access `.sweep` that stores the value of the sweep variable. This means that the value at any index of the `.sweep` returned array is the circuit measured response to the sweep value at that same index.\n",
"\n",
"And since we now have arrays of results we can start to do plotting. Where for this example we are going to store our voltage and current results from the simulations. Where the current is going to be the swept value. And then plot the two on an I-V plot. Whereas expected the voltage at the output of our source is unaffected by the load current.\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'Ideal Voltage Source response to any load')"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"iv_voltage=dc_vals[node(dummy_load['p'])].as_ndarray()\n",
"iv_current=dc_vals.sweep.as_ndarray()\n",
"plt.plot(iv_current, iv_voltage)\n",
"plt.xlabel('Load Draw [A]'); plt.ylabel('Source Voltage [V]')\n",
"plt.grid()\n",
"plt.title('Ideal Voltage Source response to any load')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# A Better `.dc` Sim Interaction¶\n",
"So as we saw that was tedious. And we have already abstracted operating point analysis away in the previous sections. So using what we leaned doing that abstraction combined with what we have just learned about how a `.dc` simulation works in contrast to a `.op` we can abstract via the following steps:\n",
"1.\tcreate the ngspice simulation access object\n",
"2.\tget the element we want to sweep SPICE name\n",
"3.\tconstruct our sweep via a slice\n",
"4.\tperform the .dc simulation\n",
"5.\tget results into more accessible structures\n",
"6.\t(extra) create a quick plot tool\n",
"\n",
"Below we accomplished that with the following class\n"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"code_folding": []
},
"outputs": [],
"source": [
"#%%writefile -a DC_1_Codes.py\n",
"\n",
"#chapter 1 section 3 dc_ease class\n",
"# class to perform easily perform DC sweep simulations\n",
"#gets both branch currents/node voltages and also internal parameters\n",
"\n",
"class dc_ease():\n",
" \"\"\"\n",
" Class to perform DC (.dc) SPICE simulation with some grace; only does single variable\n",
" and is currently limited to what +variable pyspice supports\n",
" \n",
" TODO:\n",
" make so that it can iterate over all filled in entries in `self.sweep_DF` and\n",
" exports data to xarray\n",
" \n",
" \n",
" \"\"\"\n",
" def __init__(self, circ_netlist_obj):\n",
" \"\"\"\n",
" Class to perform DC (.dc) SPICE simulation with some grace; only does single variable\n",
" and is currently limited to what variable pyspice supports\n",
" \n",
" Args:\n",
" circ_netlist_obj (pspice.Spice.Netlist.Circuit): the Netlist circuit produced \n",
" from SKiDl's `generate_netlist()`\n",
" \n",
" Returns: \n",
" creates a table of variables that could be swept in `self.sweep_DF`\n",
" this table will still need to be filled out for a single variable to be swept\n",
" \n",
" TODO: add kwargs to pass to sim creation\n",
"\n",
" \"\"\"\n",
" #need to add assertions for op_sim_circ ==pspice.Spice.Netlist.Circuit\n",
" self.circ_netlist_obj=circ_netlist_obj\n",
" \n",
" self._build_table()\n",
" \n",
" def _build_table(self):\n",
" \"\"\"\n",
" protected method to create `self.sweep_DF` dataframe of all things in the\n",
" the circuit that can be swept; currently that is only voltage and current sources\n",
" \n",
" TODO:\n",
" -when pyspice accepts more things to sweep add them below\n",
" \"\"\"\n",
" \n",
" self.sweep_DF=pd.DataFrame(columns=['Element', 'Start', 'Stop', 'Step'])\n",
" \n",
" for e in self.circ_netlist_obj.element_names:\n",
" if e[0] in ['V', 'I']:\n",
" self.sweep_DF.at[len(self.sweep_DF), 'Element']=e\n",
" \n",
" #convert ELmenet to index\n",
" self.sweep_DF.set_index('Element', drop=True, append=False, inplace=True, verify_integrity=False)\n",
" \n",
"\n",
" \n",
" def clean_table(self):\n",
" \"\"\"\n",
" Helper method to clean `self.sweep_DF` of any rows that are not to going to be swept\n",
" \"\"\"\n",
" self.sweep_DF.dropna(axis=0, how='any', inplace=True)\n",
" \n",
" def addback_elements_2table(self):\n",
" \"\"\"\n",
" Helper method to return empty rows to `self.sweep_DF` to manually then add sweep info to\n",
" uses `self._build_table` to rebuild the table\n",
" \"\"\"\n",
" for e in self.circ_netlist_obj.element_names:\n",
" if e not in self.sweep_DF.index:\n",
" self.sweep_DF.at[e, :]=np.nan\n",
" \n",
" #so ngspice is only 2d sweeps and so need figurer this out to do 2d sets\n",
" #but will, for now, do sets of 1d\n",
" #def _make_sim_control(self):\n",
" # self.clean_table()\n",
" # \n",
" # #for now dc sim through pyspice only support voltage and current sources\n",
" # self.dc_contorl={row[0]: slice(row[1], row[2], row[3]) for row in self.sweep_DF.itertuples() if row[0][0] in ['V', 'I']}\n",
" \n",
" \n",
" def _make_sim_control(self, varible):\n",
" \"\"\"\n",
" Internal method to extract the row information to the .dc kargs and slice argument\n",
" \n",
" Args:\n",
" varible (str): the index in `self.sweep_DF` to exstract the info from\n",
" \n",
" Returns:\n",
" `self.dc_contorl` what is feed into the .dc to do the simulation for a single var\n",
" \n",
" \"\"\"\n",
" #clean the table\n",
" self.clean_table()\n",
" #get the location of the variable's index\n",
" try:\n",
" row=self.sweep_DF.index.get_loc(varible)\n",
" #get said row\n",
" row=self.sweep_DF.iloc[row]\n",
" #need to fix this in pyspice to make it fully ngspice capale\n",
" if row.name[0] not in ['I', 'V']:\n",
" raise KeyError\n",
" \n",
" #build the control\n",
" self.dc_contorl={row.name:slice(row.Start, row.Stop, row.Step)}\n",
" \n",
" return 0\n",
" \n",
" except KeyError:\n",
" print(f' Variable: {varible} is not in or able self.sweep_DF to be swept ')\n",
" \n",
" return 1\n",
" \n",
" def do_dc_sim(self, varible):\n",
" \"\"\"\n",
" Does a standard Branch and Node .dc simulation for a single filled out row in `self.sweep_DF`\n",
" \n",
" Args:\n",
" variable (str): the index in `self.sweep_DF` that corresponds to the thing to sweep in the .dc simulation\n",
" \n",
" Returns: \n",
" raw results are stored in `self.dc_vals`, processed results are automatically stored in \n",
" `self.dc_resultsNB_DF` via `self.record_dc_nodebranch`\n",
" \"\"\"\n",
" \n",
" \n",
" if self._make_sim_control(varible)==0:\n",
" self.sim=self.circ_netlist_obj.simulator()\n",
" self.dc_vals=self.sim.dc(**self.dc_contorl)\n",
" \n",
" self.record_dc_nodebranch(varible)\n",
" \n",
" else:\n",
" pass\n",
" \n",
" \n",
" \n",
" def record_dc_nodebranch(self, varible):\n",
" \"\"\" \n",
" Helper method to put .dc node branch results into a dataframe where the index is the variable\n",
" \n",
" Args:\n",
" variable (str): used to set the index name\n",
" \n",
" Returns:\n",
" `self.dc_resultsNB_DF` which is a pandas dataframe with the index being the sweep and the columns being\n",
" the node voltages and branch currents from any available voltage sources\n",
" \n",
" TODO:\n",
" get the current in any current sources\n",
" \n",
" \"\"\"\n",
" self.dc_resultsNB_DF=pd.DataFrame(index=self.dc_vals.sweep.as_ndarray())\n",
" \n",
" self.dc_resultsNB_DF.index.name=varible\n",
" \n",
" #get node voltages:\n",
" \n",
" for n in self.circ_netlist_obj.node_names:\n",
" if n=='0':\n",
" continue\n",
" self.dc_resultsNB_DF[n+'_[V]']=self.dc_vals[n].as_ndarray()\n",
" \n",
" #get the current from any voltage sources:\n",
" for cm in self.circ_netlist_obj.element_names:\n",
" if 'V'==cm[0]:\n",
" self.dc_resultsNB_DF[cm+'_[A]']=-self.dc_vals[cm].as_ndarray()\n",
" \n",
" def do_dc_intsim(self, varible):\n",
" \"\"\"\n",
" Does a .dc simulation the internal variables for a single filled out row in `self.sweep_DF`\n",
" Right now the internal variables gathered are:\n",
" current, voltage power for: VCCS VCVS, CCVS, CCCS, Independent current source \n",
" current and power for Resistors and independent voltage sources\n",
" \n",
" Args:\n",
" variable (str): the index in `self.sweep_DF` that corresponds to the thing to sweep in the .dc simulation\n",
" \n",
" Returns: \n",
" raw results are stored in `self.dc_resultsINT_DF`, processed results are automatically stored in \n",
" `self.dc_resultsNB_DF` via `self.record_dc_internals`\n",
" \"\"\"\n",
" \n",
" \n",
" self.save_internals=[]\n",
" \n",
" for e in self.circ_netlist_obj.element_names:\n",
" if e[0]=='R':\n",
" self.save_internals+=[f'@{e}[i]', f'@{e}[p]']\n",
" \n",
" elif e[0]=='I':\n",
" self.save_internals+=[f'@{e}[c]', f'@{e}[v]', f'@{e}[p]']\n",
" \n",
" elif e[0]=='V':\n",
" self.save_internals+=[f'@{e}[i]', f'@{e}[p]']\n",
" \n",
" elif e[0] in ['F', 'H', 'G', 'E']:\n",
" self.save_internals+=[f'@{e}[i]', f'@{e}[v]', f'@{e}[p]']\n",
" \n",
" if self._make_sim_control(varible)==0:\n",
" self.sim=self.circ_netlist_obj.simulator()\n",
" self.sim.save_internal_parameters(*self.save_internals)\n",
" self.dc_vals=self.sim.dc(**self.dc_contorl)\n",
" \n",
" self.record_dc_internals(varible)\n",
" \n",
" def record_dc_internals(self, varible):\n",
" \"\"\" \n",
" Helper method to put .dc internal variable results into a dataframe where the index is the variable\n",
" \n",
" Args:\n",
" variable (str): used to set the index name\n",
" \n",
" Returns:\n",
" `self.dc_resultsINT_DF` which is a pandas dataframe with the index being the sweep and the columns being\n",
" the saved internal variables\n",
" \n",
" \"\"\"\n",
" self.dc_resultsINT_DF=pd.DataFrame(index=self.dc_vals.sweep.as_ndarray())\n",
" self.dc_resultsINT_DF.index.name=varible\n",
"\n",
" \n",
" for i in self.save_internals:\n",
" if i[1]=='I' and i[-2]=='c':\n",
" result_name=i[1:]+'_[A]'\n",
" \n",
" elif i[-2]=='i':\n",
" result_name=i[1:]+'_[A]'\n",
" \n",
" elif i[-2]=='v':\n",
" result_name=i[1:]+'_[V]'\n",
" \n",
" elif i[-2]=='p':\n",
" result_name=i[1:]+'_[W]'\n",
" \n",
" #deal with the fliped current for voltage sources even internally\n",
" if i[1]=='V' and i[-2]=='i':\n",
" self.dc_resultsINT_DF[result_name]=-self.dc_vals[i].as_ndarray()\n",
" else:\n",
" self.dc_resultsINT_DF[result_name]=self.dc_vals[i].as_ndarray()\n",
" \n",
" \n",
" def quick_plot(self, nodebranch_int_cont='nb'):\n",
" \"\"\"\n",
" Creates a quick plot of all columns with respect to the index for the data stored in \n",
" `self.dc_resultsNB_DF` or `self.dc_resultsINT_DF`. Note that for larger cirucits\n",
" these plots can have a ridicules number of subplots so yeah there is a reason for this\n",
" methods name\n",
" \n",
" Args:\n",
" nodebranch_int_cont (str; 'nb'): control word for wither to plot the node branch data ('nb')\n",
" or the internal data ('int')\n",
" \n",
" Returns:\n",
" Creates a rudimentary plot sharing a common x axis correspond the index\n",
" for the data source and subplot row for each column in the data source\n",
" \n",
" \"\"\"\n",
" \n",
" assert nodebranch_int_cont in ['nb', 'int'], f'{nodebranch_int_cont} in not a allowed control statment'\n",
" #add a check for existence\n",
" \n",
" if nodebranch_int_cont=='nb':\n",
" plotDF=self.dc_resultsNB_DF\n",
" elif nodebranch_int_cont=='int':\n",
" plotDF=self.dc_resultsINT_DF\n",
" \n",
" \n",
" plotDF.plot(subplots=True, sharex=True, grid=True)\n",
" # won't work for a data source with lots of columns\n",
" plt.tight_layout()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So now let's walk through using our nee tool and make sure we can get the same results. Pro tip: you can write as many docstrings as you want (and definitely should) but walk-through examples are worth a lot more to both you hours after you write the code and to the person who is picking up the code from you."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
Start
\n",
"
Stop
\n",
"
Step
\n",
"
\n",
"
\n",
"
Element
\n",
"
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
V_vs
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
\n",
"
\n",
"
Idload
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Start Stop Step\n",
"Element \n",
"V_vs NaN NaN NaN\n",
"Idload NaN NaN NaN"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# instantiate the class instance and pass in the circuit under test (DUT)\n",
"dc_sweep=dc_ease(circ)\n",
"#get the created control dataframe this is `self.sweep_DF`\n",
"dc_sweep.sweep_DF"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As stated we create a dataframe that holds all the things we can sweep that we have to fill out. Because we only simulate the results of sweeping one variable at a time this allows us to have some kind of ledger of things we want to sweep. To set the values we use the index and pandas `.at` accessor to give each row it's starting, stopping, and step value."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
"
],
"text/plain": [
" Start Stop Step\n",
"Element \n",
"V_vs 0 10 0.1\n",
"Idload 0 10 0.1"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dc_sweep.sweep_DF.at['V_vs']=0, 10, 0.1\n",
"dc_sweep.sweep_DF"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The thing about testing either code or our circuit is that to truly verify functionally it's not good enough to test just what something is supposed to do but also test to make sure it shouldn't do things we know it shouldn't do. So let's tell `dc_sweep` to do a simulation on a variable not in the control structure `dc_sweep.sweep_DF`"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" Variable: Rload is not in or able self.sweep_DF to be swept \n"
]
}
],
"source": [
"dc_sweep.do_dc_sim('Rload')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And we see that it indeed threw and caught a key error since `Rload` is not an index in `dc_sweep.sweep_D`F as we intended in `dc_sweep._make_sim_control`. If this was production code we would be looping all sorts of tests against this to verify this code's performance before we even let it try to verify any circuits under test. But functional verification of code is not the goal of this book but is a subject the reader should study.\n",
"Let's now have it sweep the dummy load as we did manually and make sure we get the same results, as we should since we are using the same circuit."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
N_1_[V]
\n",
"
V_vs_[A]
\n",
"
\n",
"
\n",
"
Idload
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0.0
\n",
"
30.0
\n",
"
-0.0
\n",
"
\n",
"
\n",
"
0.1
\n",
"
30.0
\n",
"
0.1
\n",
"
\n",
"
\n",
"
0.2
\n",
"
30.0
\n",
"
0.2
\n",
"
\n",
"
\n",
"
0.3
\n",
"
30.0
\n",
"
0.3
\n",
"
\n",
"
\n",
"
0.4
\n",
"
30.0
\n",
"
0.4
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
9.6
\n",
"
30.0
\n",
"
9.6
\n",
"
\n",
"
\n",
"
9.7
\n",
"
30.0
\n",
"
9.7
\n",
"
\n",
"
\n",
"
9.8
\n",
"
30.0
\n",
"
9.8
\n",
"
\n",
"
\n",
"
9.9
\n",
"
30.0
\n",
"
9.9
\n",
"
\n",
"
\n",
"
10.0
\n",
"
30.0
\n",
"
10.0
\n",
"
\n",
" \n",
"
\n",
"
101 rows × 2 columns
\n",
"
"
],
"text/plain": [
" N_1_[V] V_vs_[A]\n",
"Idload \n",
"0.0 30.0 -0.0\n",
"0.1 30.0 0.1\n",
"0.2 30.0 0.2\n",
"0.3 30.0 0.3\n",
"0.4 30.0 0.4\n",
"... ... ...\n",
"9.6 30.0 9.6\n",
"9.7 30.0 9.7\n",
"9.8 30.0 9.8\n",
"9.9 30.0 9.9\n",
"10.0 30.0 10.0\n",
"\n",
"[101 rows x 2 columns]"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dc_sweep.do_dc_sim('Idload')\n",
"dc_sweep.dc_resultsNB_DF"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And indeed, we get what we got manually, now let us do this again for the internals. But since the internals were not simulated when we did this manually, we must use our EE knowledge to still do the sanity check. In this cause is obvious that the voltage through the current source that serves as our load should always be 30V where the sign is flipped because SPICE."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Unit is None for @v_vs[p] power\n",
"Unit is None for @idload[p] power\n"
]
},
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
V_vs[i]_[A]
\n",
"
V_vs[p]_[W]
\n",
"
Idload[c]_[A]
\n",
"
Idload[v]_[V]
\n",
"
Idload[p]_[W]
\n",
"
\n",
"
\n",
"
Idload
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0.0
\n",
"
-0.0
\n",
"
-0.0
\n",
"
0.0
\n",
"
-30.0
\n",
"
0.0
\n",
"
\n",
"
\n",
"
0.1
\n",
"
0.1
\n",
"
3.0
\n",
"
0.1
\n",
"
-30.0
\n",
"
3.0
\n",
"
\n",
"
\n",
"
0.2
\n",
"
0.2
\n",
"
6.0
\n",
"
0.2
\n",
"
-30.0
\n",
"
6.0
\n",
"
\n",
"
\n",
"
0.3
\n",
"
0.3
\n",
"
9.0
\n",
"
0.3
\n",
"
-30.0
\n",
"
9.0
\n",
"
\n",
"
\n",
"
0.4
\n",
"
0.4
\n",
"
12.0
\n",
"
0.4
\n",
"
-30.0
\n",
"
12.0
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
9.6
\n",
"
9.6
\n",
"
288.0
\n",
"
9.6
\n",
"
-30.0
\n",
"
288.0
\n",
"
\n",
"
\n",
"
9.7
\n",
"
9.7
\n",
"
291.0
\n",
"
9.7
\n",
"
-30.0
\n",
"
291.0
\n",
"
\n",
"
\n",
"
9.8
\n",
"
9.8
\n",
"
294.0
\n",
"
9.8
\n",
"
-30.0
\n",
"
294.0
\n",
"
\n",
"
\n",
"
9.9
\n",
"
9.9
\n",
"
297.0
\n",
"
9.9
\n",
"
-30.0
\n",
"
297.0
\n",
"
\n",
"
\n",
"
10.0
\n",
"
10.0
\n",
"
300.0
\n",
"
10.0
\n",
"
-30.0
\n",
"
300.0
\n",
"
\n",
" \n",
"
\n",
"
101 rows × 5 columns
\n",
"
"
],
"text/plain": [
" V_vs[i]_[A] V_vs[p]_[W] Idload[c]_[A] Idload[v]_[V] Idload[p]_[W]\n",
"Idload \n",
"0.0 -0.0 -0.0 0.0 -30.0 0.0\n",
"0.1 0.1 3.0 0.1 -30.0 3.0\n",
"0.2 0.2 6.0 0.2 -30.0 6.0\n",
"0.3 0.3 9.0 0.3 -30.0 9.0\n",
"0.4 0.4 12.0 0.4 -30.0 12.0\n",
"... ... ... ... ... ...\n",
"9.6 9.6 288.0 9.6 -30.0 288.0\n",
"9.7 9.7 291.0 9.7 -30.0 291.0\n",
"9.8 9.8 294.0 9.8 -30.0 294.0\n",
"9.9 9.9 297.0 9.9 -30.0 297.0\n",
"10.0 10.0 300.0 10.0 -30.0 300.0\n",
"\n",
"[101 rows x 5 columns]"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dc_sweep.do_dc_intsim('Idload')\n",
"dc_sweep.dc_resultsINT_DF"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We clearly see `False` results so we need to sanity check these. When dealing with programmatic data analysis eyeball sanity checks are still an effort-saving practice. So let’s isolate the failing rows real quick since that is part of the power of having Python interact with SPICE is this kind of data handling ease."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
"
],
"text/plain": [
" V_vs[i]_[A] V_vs[p]_[W] Idload[c]_[A] Idload[v]_[V] Idload[p]_[W] \\\n",
"Idload \n",
"2.3 2.3 69.0 2.3 -30.0 69.0 \n",
"3.9 3.9 117.0 3.9 -30.0 117.0 \n",
"4.9 4.9 147.0 4.9 -30.0 147.0 \n",
"5.7 5.7 171.0 5.7 -30.0 171.0 \n",
"6.5 6.5 195.0 6.5 -30.0 195.0 \n",
"7.3 7.3 219.0 7.3 -30.0 219.0 \n",
"\n",
" Idload[A]_calc Test \n",
"Idload \n",
"2.3 2.3 False \n",
"3.9 3.9 False \n",
"4.9 4.9 False \n",
"5.7 5.7 False \n",
"6.5 6.5 False \n",
"7.3 7.3 False "
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dc_sweep_int_data[dc_sweep_int_data['Test']==False]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" So why are these rows failing, while it helps to look at a single row since the display of a full table can hide information for presentation sakes. "
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"V_vs[i]_[A] 10\n",
"V_vs[p]_[W] 300\n",
"Idload[c]_[A] 10\n",
"Idload[v]_[V] -30\n",
"Idload[p]_[W] 300\n",
"Idload[A]_calc 10\n",
"Test True\n",
"Name: 9.99999999999998, dtype: object"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dc_sweep_int_data.iloc[-1]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We see instantly that the issue is that since SPICE uses things RK45 solvers and works with near arbitrarily small currents, it is going to report extremely precise values so that inputs, for lack of a better word, yield \"jittery\" results. So then we have to use some exploratory data analysis skills along with knowing when SPICE is giving us overkill answers to clarify this. Since we know SPICE is giving us overkill on the input and we don't care in this simulation for any values beyond 4 decimals (really 2 decimals) so that applying `np.around` allows equal value reporting between our swept current and measured current."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
"
],
"text/plain": [
" I_cs[c]_[A] I_cs[v]_[V] I_cs[p]_[W] Vddrop[i]_[A] Vddrop[p]_[W]\n",
"Vddrop \n",
"0.0 0.01 0.0 -0.000 -0.01 -0.000\n",
"0.1 0.01 0.1 -0.001 -0.01 -0.001\n",
"0.2 0.01 0.2 -0.002 -0.01 -0.002\n",
"0.3 0.01 0.3 -0.003 -0.01 -0.003\n",
"0.4 0.01 0.4 -0.004 -0.01 -0.004\n",
"... ... ... ... ... ...\n",
"9.6 0.01 9.6 -0.096 -0.01 -0.096\n",
"9.7 0.01 9.7 -0.097 -0.01 -0.097\n",
"9.8 0.01 9.8 -0.098 -0.01 -0.098\n",
"9.9 0.01 9.9 -0.099 -0.01 -0.099\n",
"10.0 0.01 10.0 -0.100 -0.01 -0.100\n",
"\n",
"[101 rows x 5 columns]"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ideal_cur_res"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Before we get to the plot, let discuss something. There are two schools of thought when plotting things in EE. The first school is that the independent variable should be on the x-axis and the dependent variables should be on the y axis. The other school of thought is when comparing apples to oranges pick an axis convention and stick with it. In this book, we use both since it just a matter of context, and plots are cheap to make with a computer. For comparing voltage sources and current sources were going with the \"apples to oranges\" convention. But beware when doing this you need to make your axis labels explicit as to what are the independent and dependent variables for each plot that is made."
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.plot(ideal_cur_res['I_cs[c]_[A]'], ideal_cur_res.index)\n",
"plt.xlabel('Source Current [A]'); plt.ylabel('Load Voltage Drop [V]')\n",
"plt.grid()\n",
"plt.title('Ideal Current Source responce to a load voltage drop');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# First testbench element¶"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So first of all a physical testbench is setup with some way to probe signals into and out of a Device Under Test (DUT) where those signals are souced and read in by various instruments. The whole setup is called a test suite. Thus far we have been creating the test measurement tools with kladjlkadlfkjaldjk. We will get into test suite development when we combine a SPICE measurement, analysis routine, along with a test bench built into a single tool. For now, let’s focus on creating testbenchs.\n",
"\n",
"The first testbenchs we are going to build are non-ideal sources. So why in the world would we want these. While ideal sources don't exist outside of SPICE and SPICE ultimately doesn't pay the bills, the physical PCB and Silicon produced and being able to be sold pays the bills. So you better verify to what degrees your circuits can deal with less than ideal sources. Now traditionally one would have to redraw parts of the circuit to convert the ideal source to non-ideal sources and then be careful that the elements that make a source non-ideal don't get place and routed. And one would have to do this for every source, yuck! But this is Python so we can create a reusable way to generate non-ideal sources with functions or classes and then just deploy. When SKiDl gets the means to remove elements and connections the power to replace the ideal source with a non-ideal source and hook up any other sort of testbench will be immense.\n",
"\n",
"So how do we create a function that will do this magic of instantly producing a simple non-ideal source lets make a testbench a non-ideal voltage source and see.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Non-Ideal Voltage Source Testbench¶"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"code_folding": []
},
"outputs": [],
"source": [
"#%%writefile -a DC_1_Codes.py\n",
"\n",
"#chapter 1 section 3 real_dcVs subcircuit function\n",
"# SKiDl subcirucit to create a dc voltage source with \n",
"# added series resistor\n",
"\n",
"\n",
"@subcircuit\n",
"def real_dcVs(global_ref, pos_term, neg_term, starting_V=1@u_V, starting_R=50@u_Ohm, \n",
" return_internls=False):\n",
" \"\"\"\n",
" SKiDl subcircuit to create a simple non-ideal DC voltage source\n",
" \n",
" Args:\n",
" global_ref (str): reference to use for the base of the internal elements\n",
" \n",
" pos_term (SKiDl net or pin): positive terminal of the nonideal voltage source\n",
" to connect to the rest of the circuit\n",
" \n",
" neg_term (SKiDl net or pin): negative terminal of the nonideal voltage source\n",
" to connect to the rest of the circuit \n",
" \n",
" starting_V (float; 1; Volts):the intial DC voltage to set the internal ideal\n",
" the voltage source in this package to\n",
" \n",
" starting_R (float; 50; Ohm): the initial resistance to set the internal\n",
" serial resistance to the ideal voltage source in this subcircuit to\n",
" \n",
" return_internls (bool; False): If True return out the internal Voltage Source,\n",
" and Resistance objects in this package\n",
" \n",
" Returns:\n",
" Returns it's self a SKiDl part element object and if `return_internls`\n",
" is True will return the internal voltage and resistance objects in that order \n",
" \"\"\"\n",
" vs=V(ref=f'V_{global_ref}', dc_value=starting_V)\n",
" rs=R(ref=f'R_{global_ref}', value=starting_R)\n",
" \n",
" vs['p', 'n']+=rs[1], neg_term\n",
" rs[2]+=pos_term\n",
" \n",
" if return_internls:\n",
" return vs, rs\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The first line of code `@subcircuit` is called a decorator and for our purposes, it just says to Python that whatever function we wite below the decorator is imbued with enhancements defined by `@subcircuit` definition in SKiDl.\n",
"\n",
"Then for our function arguments, we use a lot of generic arguments for things like voltage, resistance, and the base name of the elements in our subcircuit. But for a subcircuit to be a subcircuit, it must connect to the rest of the circuit. So we need to have arguments that will act as pass-throughs for a net connection to be made to where we want our external terminals to be. In this case, we have two terminals. The positive one `pos_term` acts as the terminal to our positive output at the end of the subcircuit’s series resistors `rs`. And neg_term is the corresponding terminal to the negative side of the subcircuit’s `vs`. Now for this testbench subcircuit, we have also included a control `return_internls` to return the internal created objects so that we can grab them in python to have more refined control over them before we create the netlist. Whether we grab the internally created elements or not has no consequences on the final netlist."
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
".title \n",
"Idload N_2 0 1A\n",
"V_real_vs N_1 0 30V\n",
"R_real_vs N_1 N_2 20Ohm\n",
"\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n",
"No errors or warnings found during netlist generation.\n",
"\n"
]
},
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
Start
\n",
"
Stop
\n",
"
Step
\n",
"
\n",
"
\n",
"
Element
\n",
"
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
Idload
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
\n",
"
\n",
"
V_real_vs
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Start Stop Step\n",
"Element \n",
"Idload NaN NaN NaN\n",
"V_real_vs NaN NaN NaN"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"reset()\n",
"dummy_load=I(ref='dload', dc_value=1@u_A); dummy_load['n']+=gnd\n",
"\n",
"#invoke our subscript and for kicks have it return the internals to external variables\n",
"#that could be fine-tuned outside of there invocation inside the subcircuit\n",
"real_vss, real_vsr=real_dcVs('real_vs', dummy_load['p'], gnd, 30@u_V, 20@u_Ohm, True)\n",
"\n",
"circ=generate_netlist()\n",
"print(circ)\n",
"\n",
"dc_sweep=dc_ease(circ)\n",
"dc_sweep.sweep_DF\n"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"#make the plot\n",
"niv_voltage=real_vs_data[node(dummy_load['p'])+'_[V]']\n",
"niv_current=real_vs_data.index\n",
"#plot the old ideal voltage source\n",
"plt.plot(iv_current, iv_voltage, label='Ideal V Souce')\n",
"#plot the newly found non-ideal voltage source\n",
"plt.plot(niv_current, niv_voltage, label='NON-Ideal V Souce')\n",
"\n",
"plt.xlabel('Load Draw [A]'); plt.ylabel('Source Voltage [V]')\n",
"plt.xlabel('Load Draw [A]'); plt.ylabel('Source Voltage [V]')\n",
"\n",
"plt.grid()\n",
"plt.legend()\n",
"plt.title('Ideal and Non-Ideal Voltage Source response to load')\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And because of the scaling, we can't really see that the ideal source is at 30V but by plotting the old and new data we can see what effect adding the serial resistance to make the voltage source non-ideal has done."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Non-Ideal Current Source Testbench¶\n",
"It's typically a good idea if the investment is low enough to make the V-I dual to whatever you have made. So why not, cause again this is code we can have on hand and call up whenever needed. Opposed to finding and redrawing every single source in a schematic."
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"code_folding": []
},
"outputs": [],
"source": [
"#%%writefile -a DC_1_Codes.py\n",
"\n",
"#chapter 1 section 3 real_dcIs subcircuit function\n",
"# SKiDl subcirucit to create a dc current source with \n",
"# added parallel resistor\n",
"\n",
"@subcircuit\n",
"def real_dcIs(global_ref, pos_term, neg_term, starting_I=1@u_A, starting_R=50@u_Ohm, \n",
" return_internls=False):\n",
" \"\"\"\n",
" SKiDl subcircuit to create a simple non-ideal DC current source.\n",
" Where the positive terminal is to the top of the arrow of a schematically drawn\n",
" current source\n",
" \n",
" Args:\n",
" global_ref (str): reference to use for the base of the internal elements\n",
" \n",
" pos_term (SKiDl net or pin): positive terminal of the nonideal voltage source\n",
" to connect to the rest of the circuit \n",
" \n",
" neg_term (SKiDl net or pin): negative terminal of the nonideal voltage source\n",
" to connect to the rest of the circuit \n",
" \n",
" starting_V (float; 1; Amps): the initial DC current to set the internal ideal\n",
" the current source in this package to\n",
" \n",
" starting_R (float; 50; Ohm): the initial resistance to set the internal\n",
" parral resistance to the ideal current source in this subcircuit to\n",
" \n",
" return_internls (bool; False): If True return out the internal Voltage Source,\n",
" and Resistance objects in this package\n",
" \n",
" Returns:\n",
" Returns it's self a SKiDl part element object and if `return_internls`\n",
" is True will return the internal voltage and resistance objects in that order \n",
" \"\"\"\n",
" cs=I(ref=f'I_{global_ref}', dc_value=starting_I)\n",
" rp=R(ref=f'R_{global_ref}', value=starting_R)\n",
" \n",
" cs['p', 'n'] | rp[2, 1]\n",
" rp[1, 2]+=pos_term, neg_term\n",
" \n",
" if return_internls:\n",
" return cs, rp\n"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
".title \n",
"Vddrop N_2 0 1V\n",
"I_real_cs 0 N_2 10mA\n",
"R_real_cs N_2 0 10MegOhm\n",
"\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n",
"No errors or warnings found during netlist generation.\n",
"\n"
]
}
],
"source": [
"reset()\n",
"dummy_drop=V(ref='ddrop', dc_value=1@u_V); dummy_drop['n']+=gnd\n",
"real_css, real_csr=real_dcIs('real_cs', dummy_drop['p'], gnd, 10@u_mA, 10@u_MOhm, True)\n",
"circ=generate_netlist()\n",
"print(circ)\n"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Unit is None for @i_real_cs[p] power\n",
"Unit is None for @r_real_cs[p] power\n",
"Unit is None for @vddrop[p] power\n"
]
},
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
Vddrop[i]_[A]
\n",
"
Vddrop[p]_[W]
\n",
"
I_real_cs[c]_[A]
\n",
"
I_real_cs[v]_[V]
\n",
"
I_real_cs[p]_[W]
\n",
"
R_real_cs[i]_[A]
\n",
"
R_real_cs[p]_[W]
\n",
"
\n",
"
\n",
"
Vddrop
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0.0
\n",
"
-0.010000
\n",
"
-0.000000
\n",
"
0.01
\n",
"
0.0
\n",
"
-0.000
\n",
"
0.000000e+00
\n",
"
0.000000e+00
\n",
"
\n",
"
\n",
"
0.1
\n",
"
-0.010000
\n",
"
-0.001000
\n",
"
0.01
\n",
"
0.1
\n",
"
-0.001
\n",
"
1.000000e-08
\n",
"
1.000000e-09
\n",
"
\n",
"
\n",
"
0.2
\n",
"
-0.010000
\n",
"
-0.002000
\n",
"
0.01
\n",
"
0.2
\n",
"
-0.002
\n",
"
2.000000e-08
\n",
"
4.000000e-09
\n",
"
\n",
"
\n",
"
0.3
\n",
"
-0.010000
\n",
"
-0.003000
\n",
"
0.01
\n",
"
0.3
\n",
"
-0.003
\n",
"
3.000000e-08
\n",
"
9.000000e-09
\n",
"
\n",
"
\n",
"
0.4
\n",
"
-0.010000
\n",
"
-0.004000
\n",
"
0.01
\n",
"
0.4
\n",
"
-0.004
\n",
"
4.000000e-08
\n",
"
1.600000e-08
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
9.6
\n",
"
-0.009999
\n",
"
-0.095991
\n",
"
0.01
\n",
"
9.6
\n",
"
-0.096
\n",
"
9.600000e-07
\n",
"
9.216000e-06
\n",
"
\n",
"
\n",
"
9.7
\n",
"
-0.009999
\n",
"
-0.096991
\n",
"
0.01
\n",
"
9.7
\n",
"
-0.097
\n",
"
9.700000e-07
\n",
"
9.409000e-06
\n",
"
\n",
"
\n",
"
9.8
\n",
"
-0.009999
\n",
"
-0.097990
\n",
"
0.01
\n",
"
9.8
\n",
"
-0.098
\n",
"
9.800000e-07
\n",
"
9.604000e-06
\n",
"
\n",
"
\n",
"
9.9
\n",
"
-0.009999
\n",
"
-0.098990
\n",
"
0.01
\n",
"
9.9
\n",
"
-0.099
\n",
"
9.900000e-07
\n",
"
9.801000e-06
\n",
"
\n",
"
\n",
"
10.0
\n",
"
-0.009999
\n",
"
-0.099990
\n",
"
0.01
\n",
"
10.0
\n",
"
-0.100
\n",
"
1.000000e-06
\n",
"
1.000000e-05
\n",
"
\n",
" \n",
"
\n",
"
101 rows × 7 columns
\n",
"
"
],
"text/plain": [
" Vddrop[i]_[A] Vddrop[p]_[W] I_real_cs[c]_[A] I_real_cs[v]_[V] \\\n",
"Vddrop \n",
"0.0 -0.010000 -0.000000 0.01 0.0 \n",
"0.1 -0.010000 -0.001000 0.01 0.1 \n",
"0.2 -0.010000 -0.002000 0.01 0.2 \n",
"0.3 -0.010000 -0.003000 0.01 0.3 \n",
"0.4 -0.010000 -0.004000 0.01 0.4 \n",
"... ... ... ... ... \n",
"9.6 -0.009999 -0.095991 0.01 9.6 \n",
"9.7 -0.009999 -0.096991 0.01 9.7 \n",
"9.8 -0.009999 -0.097990 0.01 9.8 \n",
"9.9 -0.009999 -0.098990 0.01 9.9 \n",
"10.0 -0.009999 -0.099990 0.01 10.0 \n",
"\n",
" I_real_cs[p]_[W] R_real_cs[i]_[A] R_real_cs[p]_[W] \n",
"Vddrop \n",
"0.0 -0.000 0.000000e+00 0.000000e+00 \n",
"0.1 -0.001 1.000000e-08 1.000000e-09 \n",
"0.2 -0.002 2.000000e-08 4.000000e-09 \n",
"0.3 -0.003 3.000000e-08 9.000000e-09 \n",
"0.4 -0.004 4.000000e-08 1.600000e-08 \n",
"... ... ... ... \n",
"9.6 -0.096 9.600000e-07 9.216000e-06 \n",
"9.7 -0.097 9.700000e-07 9.409000e-06 \n",
"9.8 -0.098 9.800000e-07 9.604000e-06 \n",
"9.9 -0.099 9.900000e-07 9.801000e-06 \n",
"10.0 -0.100 1.000000e-06 1.000000e-05 \n",
"\n",
"[101 rows x 7 columns]"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dc_sweep=dc_ease(circ)\n",
"dc_sweep.sweep_DF.at['Vddrop']=0, 10, 0.1\n",
"dc_sweep.do_dc_intsim('Vddrop')\n",
"nonideal_cur_res=dc_sweep.dc_resultsINT_DF\n",
"nonideal_cur_res"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And the only difference in our plotting for the current source as opposed to the voltage source is that instead of setting variables for each cases voltage and current we are just calling against the resulting dataframes which has some downside from a readability standpoint but is a better practice who can be clarified with comments."
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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SgBSFtydnj178sILL3yl3/Dhw3n44Yfp06cPEydOZPr06QVPp1OnTowYMYIRI0bQq1cv5s+fn3bYpk2bsmnTps3t2Z6pd3cefPBBunXrVnB8Iol0CUgalYMPPpj77ruP6upqli9fTmVlJQDdunVjxYoVmxPAxo0bef3114Ho7KJjx45s3LiRSZMmFTztJ554go0bNwLwwQcfsGrVKnbaaScOOuigzeUuWrSIJUuW0K1bN7p06cLs2bPZtGkTS5cu5eWXXwZg//3359lnn+Xtt98G4OOPPwZg6NCh3HzzzbhHjze/9tprBccqAjoDkEbmu9/9LtOmTaNHjx7ssssuHHDAAQBstdVWTJkyhdGjR/Ppp5/yxRdfcP7559OzZ08uv/xyBgwYQPv27RkwYEDOl5uSTZ06lfPOO48WLVoAcO211/K1r32Nc889l3POOYfevXvTtGlTJk6cSPPmzTnwwAPp2rUrPXr0oHv37uy7774AtG/fngkTJnD88cezadMmdtxxR5588kkuvfRSzj//fPbee282bdpE165deeyxx+pmxklZspqjifqsf//+PnPmzPxHnHQiaz5YTOsLZ9V9ULU0ffp0Bg0aVOowvqKQuBYuXBj7dehyrXOnUMWKK99l35jW+7idfNsLrF69mn/+/IiCyzCzWe7eP11/XQISESlTSgAiImVKCUBEpEwpAYiIlCklABGRMqUEICJSppQApFEwMy688MLN7ddddx3jx4+vk7IzVTX98MMPF1SmqpqW+kAJQBqF5s2b89BDD7Fy5cpShxKLmqqmZ8+ezcKFCzfXLVRb1dXVdVKONEz6J7DUrX+MhQ/quB78r/WGb16ScZCmTZsycuRIrr/+eq688sot+r3zzjuMGDGClStX0r59e+644w522WUXhg8fTuvWrZk5cyYffPAB11xzDSeccELaaTSkqqYnTZrE/PnzU1Y13bJlS8466yyeeuopbrnlFhYvXsx1112HmbH33ntz9913s2LFCs4++2yWLFkCwA033MCBBx6Yd9xSv+kMQBqNn/zkJ0yaNIlPP/10i+6jRo3ijDPOYO7cuZx66qmMHj16c7/ly5fz3HPP8dhjjzF27NiM5TeGqqYB1q1bx4ABA5gzZw7bb789V1xxBdOmTWPOnDnceOONAJx33nmMGTOGV155hQcffJAf/ehHBcUt9ZvOAKRu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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.plot(ideal_cur_res['I_cs[c]_[A]'], ideal_cur_res.index, label='Ideal I Souce')\n",
"plt.plot(nonideal_cur_res['Vddrop[i]_[A]'], nonideal_cur_res.index, label='Non Ideal I Source')\n",
"plt.xlabel('Source Current [A]'); plt.ylabel('Load Voltage Drop [V]')\n",
"plt.grid()\n",
"plt.legend()\n",
"plt.title('Ideal and Non-Ideal Current Source responce to load');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Because of the high parallel resistance inside the non-ideal current source, we see more of a translation than a tilting. Since is this reproducible code the reader should play with values and see what happens. After all, one of the goals of this book is showing how SPICE encapsulated with python can be used as an educational enhancement in teaching electronics"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Citations:\n",
"[1] ALL ABOUT ELECTRONICS. \"Ideal Voltage Source vs. Practical Voltage Source\n",
",\" YouTube, Jan 18, 2017. [Video file]. Available: https://youtu.be/TRzpqHwb-5Y. [Accessed: Nov 30, 2020].\n",
"\n",
"[2] ALL ABOUT ELECTRONICS. \"Ideal Current Source vs. Practical Current Source\n",
",\" YouTube, Jan 21, 2017. [Video file]. Available: https://youtu.be/dTf1h_xhHng. [Accessed: Nov 30, 2020]."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.6"
},
"latex_envs": {
"LaTeX_envs_menu_present": true,
"autoclose": false,
"autocomplete": true,
"bibliofile": "biblio.bib",
"cite_by": "apalike",
"current_citInitial": 1,
"eqLabelWithNumbers": true,
"eqNumInitial": 1,
"hotkeys": {
"equation": "Ctrl-E",
"itemize": "Ctrl-I"
},
"labels_anchors": false,
"latex_user_defs": false,
"report_style_numbering": false,
"user_envs_cfg": false
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {
"height": "calc(100% - 180px)",
"left": "10px",
"top": "150px",
"width": "212.882px"
},
"toc_section_display": true,
"toc_window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}