{ "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": [ "
SoftwareVersion
Python3.7.6 64bit [GCC 7.3.0]
IPython7.12.0
OSLinux 4.19.104 microsoft standard x86_64 with debian bullseye sid
skidl0.0.31.dev0
PySpice1.4.3
lcapy0.75.dev0
sympy1.6.2
numpy1.18.1
matplotlib3.3.0
pandas1.1.4
scipy1.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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
StartStopStep
Element
V_vsNaNNaNNaN
IdloadNaNNaNNaN
\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": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
StartStopStep
Element
V_vsNaNNaNNaN
Idload0100.1
\n", "
" ], "text/plain": [ " Start Stop Step\n", "Element \n", "V_vs NaN NaN NaN\n", "Idload 0 10 0.1" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dc_sweep.sweep_DF.at['Idload']=0, 10, 0.1\n", "dc_sweep.sweep_DF" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
StartStopStep
Element
V_vs0100.1
Idload0100.1
\n", "
" ], "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
N_1_[V]V_vs_[A]
Idload
0.030.0-0.0
0.130.00.1
0.230.00.2
0.330.00.3
0.430.00.4
.........
9.630.09.6
9.730.09.7
9.830.09.8
9.930.09.9
10.030.010.0
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
V_vs[i]_[A]V_vs[p]_[W]Idload[c]_[A]Idload[v]_[V]Idload[p]_[W]
Idload
0.0-0.0-0.00.0-30.00.0
0.10.13.00.1-30.03.0
0.20.26.00.2-30.06.0
0.30.39.00.3-30.09.0
0.40.412.00.4-30.012.0
..................
9.69.6288.09.6-30.0288.0
9.79.7291.09.7-30.0291.0
9.89.8294.09.8-30.0294.0
9.99.9297.09.9-30.0297.0
10.010.0300.010.0-30.0300.0
\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": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
V_vs[i]_[A]V_vs[p]_[W]Idload[c]_[A]Idload[v]_[V]Idload[p]_[W]Idload[A]_calcTest
Idload
0.0-0.0-0.00.0-30.00.00.0True
0.10.13.00.1-30.03.00.1True
0.20.26.00.2-30.06.00.2True
0.30.39.00.3-30.09.00.3True
0.40.412.00.4-30.012.00.4True
........................
9.69.6288.09.6-30.0288.09.6True
9.79.7291.09.7-30.0291.09.7True
9.89.8294.09.8-30.0294.09.8True
9.99.9297.09.9-30.0297.09.9True
10.010.0300.010.0-30.0300.010.0True
\n", "

101 rows × 7 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", " Idload[A]_calc Test \n", "Idload \n", "0.0 0.0 True \n", "0.1 0.1 True \n", "0.2 0.2 True \n", "0.3 0.3 True \n", "0.4 0.4 True \n", "... ... ... \n", "9.6 9.6 True \n", "9.7 9.7 True \n", "9.8 9.8 True \n", "9.9 9.9 True \n", "10.0 10.0 True \n", "\n", "[101 rows x 7 columns]" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dc_sweep_int_data=dc_sweep.dc_resultsINT_DF\n", "dc_sweep_int_data['Idload[A]_calc']=(dc_sweep_int_data['Idload[p]_[W]']/-dc_sweep_int_data['Idload[v]_[V]'])\n", "dc_sweep_int_data['Test']=(dc_sweep_int_data['Idload[A]_calc']==dc_sweep_int_data.index)\n", "dc_sweep_int_data" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
V_vs[i]_[A]V_vs[p]_[W]Idload[c]_[A]Idload[v]_[V]Idload[p]_[W]Idload[A]_calcTest
Idload
2.32.369.02.3-30.069.02.3False
3.93.9117.03.9-30.0117.03.9False
4.94.9147.04.9-30.0147.04.9False
5.75.7171.05.7-30.0171.05.7False
6.56.5195.06.5-30.0195.06.5False
7.37.3219.07.3-30.0219.07.3False
\n", "
" ], "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": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
V_vs[i]_[A]V_vs[p]_[W]Idload[c]_[A]Idload[v]_[V]Idload[p]_[W]Idload[A]_calcTest
Idload
0.0-0.0-0.00.0-30.00.00.0True
0.10.13.00.1-30.03.00.1True
0.20.26.00.2-30.06.00.2True
0.30.39.00.3-30.09.00.3True
0.40.412.00.4-30.012.00.4True
........................
9.69.6288.09.6-30.0288.09.6True
9.79.7291.09.7-30.0291.09.7True
9.89.8294.09.8-30.0294.09.8True
9.99.9297.09.9-30.0297.09.9True
10.010.0300.010.0-30.0300.010.0True
\n", "

101 rows × 7 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", " Idload[A]_calc Test \n", "Idload \n", "0.0 0.0 True \n", "0.1 0.1 True \n", "0.2 0.2 True \n", "0.3 0.3 True \n", "0.4 0.4 True \n", "... ... ... \n", "9.6 9.6 True \n", "9.7 9.7 True \n", "9.8 9.8 True \n", "9.9 9.9 True \n", "10.0 10.0 True \n", "\n", "[101 rows x 7 columns]" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dc_sweep_int_data.index=np.around(dc_sweep_int_data.index, 4)\n", "dc_sweep_int_data['Idload[A]_calc']=np.around(dc_sweep_int_data['Idload[A]_calc'], 4)\n", "dc_sweep_int_data['Test']=(dc_sweep_int_data['Idload[A]_calc']==dc_sweep_int_data.index)\n", "dc_sweep_int_data" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
V_vs[i]_[A]V_vs[p]_[W]Idload[c]_[A]Idload[v]_[V]Idload[p]_[W]Idload[A]_calcTest
Idload
\n", "
" ], "text/plain": [ "Empty DataFrame\n", "Columns: [V_vs[i]_[A], V_vs[p]_[W], Idload[c]_[A], Idload[v]_[V], Idload[p]_[W], Idload[A]_calc, Test]\n", "Index: []" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dc_sweep_int_data[dc_sweep_int_data['Test']==False]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And finally we need to test every future so lets make the quick plots." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "dc_sweep.quick_plot()" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "image/png": "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okVRx+zbt49bb72V6upqCgsLueCCC3j22WeZPXs2y5cvZ+DAgfj9fs477zzeeustxowZw3XXXcf69esZPXo08+bNa7f8H//4xxQUFPD2228D8MUXX3QhAtGee+45vv71rzNmzBgGDRpEdXU1kyZN6vb1rGiCUkeFMYYGX0O7w5A763NJdBqYLHtWVOLIdeVS5CmK62cJf961dRdnn3F2a/LJceVop75Kmw0bNlBeXo7dbmf48OGce+65ccds3ryZ0tJShgwJTu69YMECNmzYwOzZs1mzZg0VFRX4fD7279/P1q1bCQQCjBo1ipKSEgCuuOIKKioqLMv/85//zOrVq1u3Cwu7v45sZWUl1113HQCXX345lZWVmqDU0RceMRZbK4nq1O9g8sralmCnfsAEOizHYXPEjQQ7Pv/4uBpK7NDkyKYxl926yaQ99g/snDzo5GTCo3qRRGs6VrryUGo67N69mxUrVrB582YKCwtZuHAhTU2dTwybDp9//jnr16/nrbfe4uabb8bv9yMi/PSnP01p07QmqH6g2d9Mjb+GPUf2dFhDiWseizi2sxFjNrHFjQobljuMMc4x8bMiu3LJd+a3fQ7VaLLsWdrvovq0c845h0cffZSrrrqKzz77jFdffZX58+dHHTNlyhRuuukmDh06RGFhIZWVldx4443U1NSQk5NDQUEBBw4cYN26dZSWljJ27Fj27NnDrl27OPHEE6msrGy3/PPPP5+HH36YBx98EAg28XWnFvXb3/6WK6+8khUrVrQm7a997Wv87//+L+ecc06Xr9ceTVAZriXQ0qVhyFad/K3TwOy1LkOQYKd+RA1liGcIowpGWT40aTU0OduRrclFqU7MmTOH9evXM27cOI477jimTp0ad8ywYcO49957KSsrax0kMWvWLAAmTpzI2LFjGTlyJNOmTQOC89tVVFQwc+ZMPB4PZ599NrW1tZbl33HHHdxwww2ceuqp2O127rzzTr75zW92+eeorKzk1luja6OXXXYZlZWVvStBicgM4OeAHVhpjLk33WVminCnfnvTwFhNtx9bi0lkbZfwNDDhGkp4GpjIGsq+Pfs4/ZTTLYcjh9d2UUqlR/h5IBHhoYcesjymqqqq9XN5eTnl5fFzcK9atcry3BkzZrB9e+eDP3Jzc/l//+//dX7DnXj11VcBohLhTTfdlPR1Y6U1QYmI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zW5vq5FkB/tUBhQNjUggMf0t2W1JyJ0T/N6R4DBclXmMMdx44428/PLLjBw5EpfLZXlcZWUl99xzD8YYZs6cyX333QfA9ddfz+bNm2lsbGTu3LncfffdALz44ovccssteDwepk+f3uE9/P73v+cb3/gGRUVFrF69mttuuy3h+9+5cyff+c53OHjwIHa7nWeeeYaioiJmzZrFF198QUtLCz/5yU+YNWtW3Ln33XcfTz75JDabjYsuuoh777034XKtaIJSvYavpcViZFg7U780BJ/Qb6qPHr5sNQ3MzojPIjZcnuzWJjCXJ4e8wUMYHNmvku3BnZMb09/SNiWMI8t6qLM6Ol5dVcFnH36Q0msec/wJTL6svcc9o61du5YdO3awdetWDhw4wLhx41i0aFHUMfv27ePWW2+lurqawsJCLrjgAp599llmz57N8uXLGThwIH6/n/POO4+33nqLMWPGcN1117F+/XpGjx7NvHnzOryHyspKfvjDH1JUVMRll13WpQS1YMECli1bxpw5c2hqaiIQCOByuVi7di35+fkcOnSIr371q1x66aVR561bt47nnnuOTZs24fF4+PzzzxMusz2aoNRREfD74/pcmhtDTV4JdvD7WrydluPKzo6a4iVnQCEDh4+IaioL11KyPB62bn+Pr06f3vq9052tyUUlZcOGDZSXl2O32xk+fDjnnntu3DGbN2+mtLSUIUOCE3gvWLCADRs2MHv2bNasWUNFRQU+n4/9+/ezdetWAoEAo0aNoqSkBIArrriCiooKy/IPHDjA+++/z/Tp0xERnE4n77zzDqeeemqn915bW8snn3zCnDlzgOCDtQAtLS3cdtttbNiwAZvNxieffMKBAweiZnf/85//zNVXX43H4wFg4MCBXYiaNU1QqlMmEKC5saHtwcmIySnDnfbxo8Sik04i08A4srKi+l3cuXnkHzM0lGwiaiuhucaysiP25+R0axqYj47UM3jk8d0NjcpAZQsXp+W6tbW1ablupN27d7NixQo2b95MYWEhCxcupKmp8wExkdasWcMXX3zR+jBsTU0NlZWVLF++vNv39dRTT3Hw4EGqq6txOp0UFxfT1NSU9uVHNEH1ccERY01462o49NGemFFioQTT2F4Hf/DBSm9jY6flOJyuqGQRfN5lcFt/S05MJ352dD+MK9vT7U59pTLJOeecw6OP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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "dc_sweep.quick_plot('int')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Ideal Current Source¶\n", "Since we are talking about ideal vs non-ideal sources, we should look at the current complement to the voltage case and use our new tool to automate as much as we can." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ ".title \n", "I_cs 0 N_1 10mA\n", "Vddrop N_1 0 1V\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n", "No errors or warnings found during netlist generation.\n", "\n" ] } ], "source": [ "reset()\n", "cs=I(ref='_cs', dc_value=10@u_mA)\n", "\n", "dummy_drop=V(ref='ddrop', dc_value=1@u_V)\n", "\n", "cs['p']+=gnd\n", "#ideal_rpar[1, 2]+=cs['n'], gnd\n", "dummy_drop['p', 'n']+=cs['n'], gnd\n", "\n", "circ=generate_netlist()\n", "print(circ)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
StartStopStep
Element
I_csNaNNaNNaN
VddropNaNNaNNaN
\n", "
" ], "text/plain": [ " Start Stop Step\n", "Element \n", "I_cs NaN NaN NaN\n", "Vddrop NaN NaN NaN" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dc_sweep=dc_ease(circ)\n", "dc_sweep.sweep_DF" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Unit is None for @vddrop[p] power\n", "Unit is None for @i_cs[p] power\n" ] } ], "source": [ "dc_sweep.sweep_DF.at['Vddrop']=0, 10, 0.1\n", "dc_sweep.do_dc_intsim('Vddrop')\n", "ideal_cur_res=dc_sweep.dc_resultsINT_DF" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
I_cs[c]_[A]I_cs[v]_[V]I_cs[p]_[W]Vddrop[i]_[A]Vddrop[p]_[W]
Vddrop
0.00.010.0-0.000-0.01-0.000
0.10.010.1-0.001-0.01-0.001
0.20.010.2-0.002-0.01-0.002
0.30.010.3-0.003-0.01-0.003
0.40.010.4-0.004-0.01-0.004
..................
9.60.019.6-0.096-0.01-0.096
9.70.019.7-0.097-0.01-0.097
9.80.019.8-0.098-0.01-0.098
9.90.019.9-0.099-0.01-0.099
10.00.0110.0-0.100-0.01-0.100
\n", "

101 rows × 5 columns

\n", "
" ], "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
StartStopStep
Element
IdloadNaNNaNNaN
V_real_vsNaNNaNNaN
\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": [ "#perform the simulation\n", "dc_sweep.sweep_DF.at[get_skidl_spice_ref(dummy_load)]=[0, 10, 0.1]\n", "dc_sweep.do_dc_sim(get_skidl_spice_ref(dummy_load))\n", "dc_sweep.quick_plot()" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
N_2_[V]N_1_[V]V_real_vs_[A]
Idload
0.030.030.0-0.0
0.128.030.00.1
0.226.030.00.2
0.324.030.00.3
0.422.030.00.4
............
9.6-162.030.09.6
9.7-164.030.09.7
9.8-166.030.09.8
9.9-168.030.09.9
10.0-170.030.010.0
\n", "

101 rows × 3 columns

\n", "
" ], "text/plain": [ " N_2_[V] N_1_[V] V_real_vs_[A]\n", "Idload \n", "0.0 30.0 30.0 -0.0\n", "0.1 28.0 30.0 0.1\n", "0.2 26.0 30.0 0.2\n", "0.3 24.0 30.0 0.3\n", "0.4 22.0 30.0 0.4\n", "... ... ... ...\n", "9.6 -162.0 30.0 9.6\n", "9.7 -164.0 30.0 9.7\n", "9.8 -166.0 30.0 9.8\n", "9.9 -168.0 30.0 9.9\n", "10.0 -170.0 30.0 10.0\n", "\n", "[101 rows x 3 columns]" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#collect the results \n", "real_vs_data=dc_sweep.dc_resultsNB_DF\n", "real_vs_data" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'Ideal and Non-Ideal Voltage Source response to load')" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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C677G3v37k1cXNzp58nJyUybNu1054oppk6dyp49e/j+++9Zv349M2bMoHTp0rkcrTF5RHhhaPcI9F8EJSvDx7fC1Jud4Wa9CMeTvQaTzx6C39anOavoqZMQloWXqEID59AyA+Hh4fTv35+XX36Zp59++ox5zz33HC+88AJly5YFoHHjxvTr148xY8bw1FNPAXD//ffz9NNP07lzZ7/Dmj9/PsOHD6dYsWJcfvnlp8t9uyw/fvw4Tz75JN27d2fnzp307duXI0eOADB69GhatmyZ7vb79OnDDTfcwOOPPw7A4sWLqVat2lmdI+7du5eKFStSoIDzm6VKlf91KzZlyhSeeeYZVJWrrrrq9FFKREQEiYnOiGjTpk1jzpw5TJgwgd9//50BAwawY8cOAMaOHUvLli2ZNGkSr732GidOnKBZs2a88cYbWerm3pigUaE+3PkVLB8D8c/AmGbQ8Wm47OZc6QAxhR1peGjw4MFMnjyZQ4cOnVG+ceNGoqKiziiLjo4+3fcUQIsWLShUqNDpvqoyc+zYMe666y4+/fRTVq9efcZRy9NPP027du1YsWIFc+bM4f777+fIkSOnu/9Ys2YNU6dOZdiwYRnuo0GDBhQoUIB169YB6Y/b0atXLz799FMaNWrEiBEjTvdBtWfPHh588EEWLlzI2rVrWblyJTNnzsxwn8OGDaNt27asW7eONWvWUK9ePTZv3szUqVP5+uuvWbt2LWFhYX730WVMUAsLd+4cH/iNk0RmD4EProG/duZaCHakkcERwdEAd6lRsmRJbrnlFl577TWKFi16zus/+uijjBo16qxrBmnZsmULNWrUoFatWgDcfPPNjBs3DnD6nJo9ezYvvvgiycnJHDt2jF27dlGpUiWGDBly+ot327Ztme4npTfdevXqMXPmTJ544omzlqlSpQpbt25l4cKFLFy4kPbt2/Pxxx+TmJhITEwM5cqVA+Cmm25i8eLFXHPNNenub+HChUycOBGAsLAwSpUqxQcffMDq1atp0qQJAEePHqV8+fKZxm5MnnH+hdBvDqx+D7583Glh1f4/0LQ/FAjsEbUlDY8NHz6cxo0bc9ttt50uq1u3LqtXr6Zdu3any1avXk29emcOLdKuXTseffRRli9ffrrstttu47vvvqNSpUrMmzfPrxh8uyz37Xtq5MiRREZGsm7dOpKTkylSpEim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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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Vddrop[i]_[A]Vddrop[p]_[W]I_real_cs[c]_[A]I_real_cs[v]_[V]I_real_cs[p]_[W]R_real_cs[i]_[A]R_real_cs[p]_[W]
Vddrop
0.0-0.010000-0.0000000.010.0-0.0000.000000e+000.000000e+00
0.1-0.010000-0.0010000.010.1-0.0011.000000e-081.000000e-09
0.2-0.010000-0.0020000.010.2-0.0022.000000e-084.000000e-09
0.3-0.010000-0.0030000.010.3-0.0033.000000e-089.000000e-09
0.4-0.010000-0.0040000.010.4-0.0044.000000e-081.600000e-08
........................
9.6-0.009999-0.0959910.019.6-0.0969.600000e-079.216000e-06
9.7-0.009999-0.0969910.019.7-0.0979.700000e-079.409000e-06
9.8-0.009999-0.0979900.019.8-0.0989.800000e-079.604000e-06
9.9-0.009999-0.0989900.019.9-0.0999.900000e-079.801000e-06
10.0-0.009999-0.0999900.0110.0-0.1001.000000e-061.000000e-05
\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 }