{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib notebook\n",
"%config InlineBackend.figure_format = 'svg'\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/cypheon/.local/share/virtualenvs/pyspice-notebook-JSLbnKOc/lib/python3.7/site-packages/PySpice/Logging/Logging.py:47: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.\n",
" logging_config = yaml.load(open(logging_config_file_name, 'r'))\n"
]
}
],
"source": [
"import PySpice.Logging.Logging as Logging\n",
"logger = Logging.setup_logging()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"from PySpice.Spice.Netlist import Circuit, SubCircuit, SubCircuitFactory\n",
"from PySpice.Unit import *\n",
"from PySpice.Spice.Parser import SpiceParser\n",
"from PySpice.Probe.Plot import plot"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"PieceWiseLinearVoltageSource Vvin"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# define a small circuit in code, you could also read a file and load the netlist from a string (see below)\n",
"circ = Circuit('small test')\n",
"\n",
"circ.R('1', 1, 2, 10@u_kOhm)\n",
"circ.C('2', 2, 0, 100@u_nF)\n",
"circ.PieceWiseLinearVoltageSource('vin', 1, 0, [(0@u_ms, 0@u_V), (10@u_ms, 0@u_V), (11@u_ms, 5@u_V), (20@u_ms, 5@u_V)])"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
".title small test\n",
"R1 1 2 10kOhm\n",
"C2 2 0 100nF\n",
"Vvin 1 0 PWL(0ms 0V 10ms 0V 11ms 5V 20ms 5V r=0s td=0.0s)\n",
"\n"
]
}
],
"source": [
"# check the generated netlist\n",
"netlist = str(circ)\n",
"print(netlist)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"# re-parse the stringified netlist into a netlist again\n",
"parser = SpiceParser(source=netlist)\n",
"parsed_circuit = parser.build_circuit()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
".title small test\n",
"R1 1 2 10kOhm\n",
"C2 2 0 100nF\n",
"Vvin 1 0 PWL(0ms 0V 10ms 0V 11ms 5V 20ms 5V r=0s td=0.0s)\n",
"\n"
]
}
],
"source": [
"# this netlist output string should be equivalent to the one above\n",
"print(str(parsed_circuit))"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<ESC>[1;32m2020-04-02 20:21:27,600<ESC>[0m - <ESC>[1;34mPySpice.Spice.NgSpice.Shared.NgSpiceShared.new_instance<ESC>[0m - <ESC>[1;31mINFO<ESC>[0m - New instance for id 0\n",
"<ESC>[1;32m2020-04-02 20:21:27,650<ESC>[0m - <ESC>[1;34mPySpice.Spice.NgSpice.Shared.NgSpiceShared._init_ngspice<ESC>[0m - <ESC>[1;31mWARNING<ESC>[0m - Unsupported Ngspice version 31\n",
"<ESC>[1;32m2020-04-02 20:21:27,656<ESC>[0m - <ESC>[1;34mPySpice.Spice.NgSpice.Shared.NgSpiceShared._send_char<ESC>[0m - <ESC>[1;31mERROR<ESC>[0m - Warning: vvin: no DC value, transient time 0 value used\n",
"CPU times: user 12.6 ms, sys: 3.56 ms, total: 16.2 ms\n",
"Wall time: 15.9 ms\n"
]
}
],
"source": [
"# create a simulator\n",
"sim = circ.simulator()\n",
"\n",
"# perform the analysis (and time it)\n",
"%time analysis = sim.transient(100@u_us, 50@u_ms)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support. ' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" if (mpl.ratio != 1) {\n",
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
" }\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var backingStore = this.context.backingStorePixelRatio ||\n",
"\tthis.context.webkitBackingStorePixelRatio ||\n",
"\tthis.context.mozBackingStorePixelRatio ||\n",
"\tthis.context.msBackingStorePixelRatio ||\n",
"\tthis.context.oBackingStorePixelRatio ||\n",
"\tthis.context.backingStorePixelRatio || 1;\n",
"\n",
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width * mpl.ratio);\n",
" canvas.attr('height', height * mpl.ratio);\n",
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>');\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option);\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width / mpl.ratio, fig.canvas.height / mpl.ratio);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>');\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" // select the cell after this one\n",
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
" IPython.notebook.select(index + 1);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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YeSFF17AV199ZWL13sOKfm6KAVCwup9dEhIScMstt/j0EwA80de1tbUIDQ1Fx44dUVZWZk7hXsaqfnY4HHj55ZcxZcoUAPD5AGhVPw8YMAAdO3bEHXfcga5du+Lzzz/H2bNnzf8AEmIAtFhJSQn8/PyQkpLSrP3bb7+Fv7//dV9z2223ITIyslnbzJkzceeddwIQp8X9/Pxw8uTJZj/z9ttvo3///iZW7z2s6OemGAAFq/sZAKqrq/HUU0/h3XffNadoL2VlX69btw7//u//jltuuQVdunRBenq6ucV7Eav6OTAwEL1790ZDQwMABkCr+nnZsmVYu3Yt9u/fj5iYGDzyyCN4+umnUV9fb/6HkAwDoMUYAD2DAdAzrO7nuro6vPnmm3jyySd9+uwfYG1fX7p0CQUFBUhNTcVHH32E+++//4bXYcnOin7OyMjAXXfd1exGJgZA6//zCOjfkPnyJQ3uYgC0GL8C9gx+BewZVvZzXV0dfv/73+Pxxx/nVzjw3NftAPDQQw8hMDDQWMFeyop+njx5Mm655RbceuutjZufnx/+5V/+BYqiWPI52jpPjufbb78dc+bMMVawD2AA9AB/f398+eWXjX92OBy45557fvTC1zfeeKNZ27PPPnvNTSATJ05s/PuKigreBGJyPzfFAKizop9d4e/RRx/16btRr2blmG7qwQcfREBAgOF6vZXZ/Xz27FlkZ2c327p06QJVVXHgwAHrPkgb54nxXFxcjFtuuQVr1641p2iJMQB6QFRUFNq3b4/w8HDk5eXh008/RadOnXD69GkAwPvvv4/Bgwc3/nxycjL+9V//FRMnTkR+fj4CAgKuuwxMp06dGq996NevH5eBsaCfz507h8zMTKxfvx5+fn6IiopCZmYmTp065fHP11aY3c91dXXo27cv7r33XmRlZTVbzqG2ttaWz9hWmN3Xly5dwpAhQ5CamoqjR48iIyMDH374Idq3b4+cnBxbPmNbYMWx42q+/hUwYH4/V1ZW4ptvvkFqaiqKioqwefNmPPXUU3j44YdRU1Njy2f0JgyAHjJ9+nTcd999aNeuHfz9/ZstvPriiy9iwIABzX4+OjoaXbt2Rbt27fDoo4/ecCHou+66C+3bt0fPnj1x8OBBT3yUNs3sfl68ePE1i4z6+fn59NkSwNx+dp1dvd62detWD32itsvMvq6ursZbb72FLl26oF27dujcuTP69u3r0zeBuJh97LgaA6BgZj9fvnwZr7zyCu644w7cdtttUBQFAwcObAyU9OMYAImIiIh8DAMgERERkY9hACQiIiLyMQyARERERD6GAZCIiIjIxzAAEhEREfkYBkAiIiIiH8MASERERORjGACJiIiIfAwDIBEREZGPYQAkIiIi8jEMgEREREQ+hgGQiIiIyMcwABIRERH5GAZAIiIiIh/DAEhERETkYxgAiYiIiHwMAyARERGRj2EAJCIiIvIxDIBEREREPoYBkIiIiMjHMAASERER+RgGQCIiIiIfwwBIRERE5GMYAImIiIh8DAMgERERkY9hACQiIiLyMQyARERERD6GAZCIiIjIxzAAEhEREfkYBkAiIiIiH8MASERERORj/h9GTTMv6YdZ0wAAAABJRU5ErkJggg==\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"axe = plt.subplot()\n",
"plot(analysis['1'], label=r'$V_{in}$')\n",
"plot(analysis['2'], label=r'$V_{C_2}$')\n",
"axe.legend();"
]
},
{
"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.7"
}
},
"nbformat": 4,
"nbformat_minor": 2
}