diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml
index cc06d2b..d1653da 100644
--- a/.github/workflows/ci-cd.yml
+++ b/.github/workflows/ci-cd.yml
@@ -10,12 +10,12 @@ jobs:
# Define job steps
steps:
- name: Set up Python
- uses: actions/setup-python@v4
+ uses: actions/setup-python@v5
with:
- python-version: "3.9"
+ python-version: "3.11"
- name: Check-out repository
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Install poetry
uses: snok/install-poetry@v1
@@ -23,16 +23,30 @@ jobs:
- name: Install package
run: poetry install
+ - name: Linter
+ uses: psf/black@stable
+
- name: Test with pytest
run: poetry run pytest tests/ --cov=sysloss --cov-report=xml
- name: Use Codecov to track coverage
- uses: codecov/codecov-action@v3
+ uses: codecov/codecov-action@v4.0.1
with:
- files: ./coverage.xml # coverage report
+ token: ${{ secrets.CODECOV_TOKEN }}
+ slug: geddy11/sysloss
+ #files: ./coverage.xml # coverage report (dont enable)
+
+ # - name: Coverage badge
+ # uses: tj-actions/coverage-badge-py@v2
+
+ - name: Install Jupyter-book
+ run: pip install jupyter-book==1.0.0 sphinx-autoapi matplotlib toml scipy rich rustworkx pandas numpy
+
+ - name: Create Sphinx configuration
+ run: jupyter-book config sphinx docs
- name: Build documentation
- run: poetry run make html --directory docs/
+ run: sphinx-build docs docs/_build/html -b html
cd:
permissions:
@@ -51,12 +65,12 @@ jobs:
# Define job steps
steps:
- name: Set up Python
- uses: actions/setup-python@v4
+ uses: actions/setup-python@v5
with:
- python-version: "3.9"
+ python-version: "3.11"
- name: Check-out repository
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
with:
fetch-depth: 0
@@ -92,3 +106,5 @@ jobs:
if: steps.release.outputs.released == 'true'
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index a1d0557..110e4e8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,7 @@
+*.json
+!tests/data/*.json
+work
+
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
@@ -70,6 +74,9 @@ instance/
# Sphinx documentation
docs/_build/
+docs/jupyter_execute
+docs/conf.py
+docs/nb/*.toml
# PyBuilder
target/
@@ -140,6 +147,3 @@ dmypy.json
# MacOS
.DS_Store
-
-# Various
-work
diff --git a/.readthedocs.yml b/.readthedocs.yml
index ae72745..432eae3 100644
--- a/.readthedocs.yml
+++ b/.readthedocs.yml
@@ -9,7 +9,7 @@ version: 2
build:
os: ubuntu-22.04
tools:
- python: "3.9"
+ python: "3.11"
jobs:
post_create_environment:
# Install poetry
@@ -20,7 +20,10 @@ build:
post_install:
# Install dependencies with 'docs' dependency group
# https://python-poetry.org/docs/managing-dependencies/#dependency-groups
- - poetry install
+ - poetry install --with docs
+ pre_build:
+ # Generate the Sphinx configuration for this Jupyter Book so it builds.
+ - "jupyter-book config sphinx docs/"
# Build documentation in the "docs/" directory with Sphinx
sphinx:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3f537a1..4dc68c6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,7 +1,2 @@
# Changelog
-
-
-## v0.1.0 (29/02/2024)
-
-- First release of `sysloss`!
\ No newline at end of file
diff --git a/CITATION.cff b/CITATION.cff
new file mode 100644
index 0000000..cf76643
--- /dev/null
+++ b/CITATION.cff
@@ -0,0 +1,20 @@
+cff-version: 1.2.0
+title: sysLoss
+message: >-
+ If you use this software, please cite it using the
+ metadata from this file.
+type: software
+authors:
+ - given-names: Geir
+ family-names: Drange
+ affiliation: Inventas AS
+ orcid: 'https://orcid.org/0009-0009-6795-8583'
+repository-code: 'https://github.com/geddy11/sysloss'
+url: 'https://github.com/geddy11/sysloss'
+abstract: sysLoss is a tool for analyzing system power and losses.
+keywords:
+ - system
+ - power
+ - loss
+license: MIT
+version: 1.0.0
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 6772a21..1067755 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -63,9 +63,11 @@ Ready to contribute? Here's how to set up `sysloss` for local development.
Before you submit a pull request, check that it meets these guidelines:
-1. The pull request should include additional tests if appropriate.
-2. If the pull request adds functionality, the docs should be updated.
-3. The pull request should work for all currently supported operating systems and versions of Python.
+1. Use Black code formatter (formatting is checked in the CI pipeline).
+2. The pull request should include additional tests if appropriate. Code coverage shall be 100%.
+3. If the pull request adds functionality, the docs shall be updated.
+4. The pull request should work for all currently supported operating systems and versions of Python.
+5. Tutorials shall not contain references to or mentions of specific vendors, products or components.
## Code of Conduct
diff --git a/README.md b/README.md
index b57b404..9f391d0 100644
--- a/README.md
+++ b/README.md
@@ -1,16 +1,47 @@
-# sysloss
-Power analysis of circuits and systems.
+![sysLoss logo](docs/sysloss.svg)
-## Installation
+
+
+
+
+
+
+
+# sysLoss
+sysLoss is a tool for analyzing system power and losses. From the smallest IoT sensor to large industrial installations. The tool is efficient and easy to use, the analysis result provides a detailed report on voltages, currents, power and efficiency for every component defined in the system. Output format is Pandas DataFrame: Create charts, plots and export to Excel and other formats.
+## Installation
```bash
$ pip install sysloss
```
## Usage
-
-- TODO
+```python
+from sysloss.components import *
+from sysloss.system import System
+
+bts = System("Bluetooth sensor", Source("CR2032", vo=3.0, rs=10))
+bts.add_comp("CR2032", comp=Converter("Buck 1.8V", vo=1.8, eff=0.87))
+bts.add_comp("Buck 1.8V", comp=PLoad("MCU", pwr=13e-3))
+bts.add_comp("CR2032", comp=Converter("Boost 5V", vo=5.0, eff=0.82))
+bts.add_comp("Boost 5V", comp=RLoss("RC filter", rs=6.8))
+bts.add_comp("RC filter", comp=ILoad("Sensor", ii=6e-3))
+bts.tree()
+```
+```
+Bluetooth sensor
+└── CR2032
+ ├── Boost 5V
+ │ └── RC filter
+ │ └── Sensor
+ └── Buck 1.8V
+ └── MCU
+```
+```python
+bts.solve()
+```
+![result](docs/bts.png)
## Contributing
@@ -19,7 +50,3 @@ Interested in contributing? Check out the contributing guidelines. Please note t
## License
`sysloss` was created by Geir Drange. It is licensed under the terms of the MIT license.
-
-## Credits
-
-`sysloss` was created with [`cookiecutter`](https://cookiecutter.readthedocs.io/en/latest/) and the `py-pkgs-cookiecutter` [template](https://github.com/py-pkgs/py-pkgs-cookiecutter).
diff --git a/docs/Getting started.md b/docs/Getting started.md
new file mode 100644
index 0000000..cf716ff
--- /dev/null
+++ b/docs/Getting started.md
@@ -0,0 +1,47 @@
+# Welcome to sysLoss
+*sysLoss* is a tool for analyzing system power and losses. From the smallest IoT sensor to large industrial installations. The tool is efficient and easy to use, the analysis result provides a detailed report on voltages, currents, power and efficiency for every component defined in the system. Output format is Pandas DataFrame: Create charts, plots and export to Excel and other formats.
+
+## Installation
+To get started with *sysLoss*, install the python package from PyPI with:
+```bash
+$ pip install sysloss
+```
+Upgrade to the latest release with:
+```bash
+$ pip install --upgrade sysloss
+```
+
+## First system model
+A simple, battery-powered Bluetooth sensor can be defined as simple as this:
+```python
+from sysloss.components import *
+from sysloss.system import System
+
+bts = System("Bluetooth sensor", Source("CR2032", vo=3.0, rs=10))
+bts.add_comp("CR2032", comp=Converter("Buck 1.8V", vo=1.8, eff=0.87))
+bts.add_comp("Buck 1.8V", comp=PLoad("MCU", pwr=13e-3))
+bts.add_comp("CR2032", comp=Converter("Boost 5V", vo=5.0, eff=0.82))
+bts.add_comp("Boost 5V", comp=RLoss("RC filter", rs=6.8))
+bts.add_comp("RC filter", comp=ILoad("Sensor", ii=6e-3))
+bts.tree()
+```
+```
+Bluetooth sensor
+└── CR2032
+ ├── Boost 5V
+ │ └── RC filter
+ │ └── Sensor
+ └── Buck 1.8V
+ └── MCU
+```
+```python
+bts.solve()
+```
+![result](bts.png)
+
+## Next step
+The best way to learn *sysLoss* is to explore the tutorials section. The tutorials are Jupyter Notebooks that can also be found in the GitHub repository under docs/nb.
+
+```{tableofcontents}
+```
+
diff --git a/docs/_config.yml b/docs/_config.yml
index 2952f8a..4d05c01 100644
--- a/docs/_config.yml
+++ b/docs/_config.yml
@@ -34,4 +34,24 @@ repository:
# See https://jupyterbook.org/customize/config.html#add-a-link-to-your-repository
html:
use_issues_button: true
- use_repository_button: true
\ No newline at end of file
+ use_repository_button: true
+
+# Sphinx autodoc
+sphinx:
+ extra_extensions:
+ - 'autoapi.extension'
+# - 'sphinx.ext.autodoc'
+ - 'sphinx.ext.napoleon'
+ - 'sphinx.ext.viewcode'
+# - 'sphinx_external_toc'
+# - 'sphinx.ext.autosummary'
+ config:
+# autosummary_generate: True
+
+ config:
+ autoapi_dirs: ["../src"] # location to parse for API reference
+ autoapi_options:
+ ['members', 'undoc-members']
+ #external_toc_path: "docs/_toc.yml"
+ #html_theme: "sphinx_rtd_theme"
+ add_module_names: False
diff --git a/docs/_toc.yml b/docs/_toc.yml
index d4311d4..138f06d 100644
--- a/docs/_toc.yml
+++ b/docs/_toc.yml
@@ -2,8 +2,13 @@
# Learn more at https://jupyterbook.org/customize/toc.html
format: jb-book
-root: intro
+root: Getting started
chapters:
-- file: markdown
-- file: notebooks
-- file: markdown-notebooks
\ No newline at end of file
+- file: autoapi/index
+- file: nb/Component files
+- file: tutorials
+ sections:
+ - file: nb/Bluetooth sensor
+ - file: nb/Sensor daisy chain
+ - file: nb/PCIe FPGA
+ - file: nb/Datacenter rack
diff --git a/docs/bts.png b/docs/bts.png
new file mode 100644
index 0000000..ef42f48
Binary files /dev/null and b/docs/bts.png differ
diff --git a/docs/content.md b/docs/content.md
deleted file mode 100644
index 0f6aca7..0000000
--- a/docs/content.md
+++ /dev/null
@@ -1,5 +0,0 @@
-Content in Jupyter Book
-=======================
-
-There are many ways to write content in Jupyter Book. This short section
-covers a few tips for how to do so.
diff --git a/docs/intro.md b/docs/intro.md
deleted file mode 100644
index 95577c4..0000000
--- a/docs/intro.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Welcome to your Jupyter Book
-
-This is a small sample book to give you a feel for how book content is
-structured.
-It shows off a few of the major file types, as well as some sample content.
-It does not go in-depth into any particular topic - check out [the Jupyter Book documentation](https://jupyterbook.org) for more information.
-
-Check out the content pages bundled with this sample book to see more.
-
-```{tableofcontents}
-```
\ No newline at end of file
diff --git a/docs/logo.png b/docs/logo.png
new file mode 100644
index 0000000..8cf7e19
Binary files /dev/null and b/docs/logo.png differ
diff --git a/docs/markdown-notebooks.md b/docs/markdown-notebooks.md
deleted file mode 100644
index 6d97104..0000000
--- a/docs/markdown-notebooks.md
+++ /dev/null
@@ -1,54 +0,0 @@
----
-jupytext:
- cell_metadata_filter: -all
- formats: md:myst
- text_representation:
- extension: .md
- format_name: myst
- format_version: 0.13
- jupytext_version: 1.11.5
-kernelspec:
- display_name: Python 3
- language: python
- name: python3
----
-
-# Notebooks with MyST Markdown
-
-Jupyter Book also lets you write text-based notebooks using MyST Markdown.
-See [the Notebooks with MyST Markdown documentation](https://jupyterbook.org/file-types/myst-notebooks.html) for more detailed instructions.
-This page shows off a notebook written in MyST Markdown.
-
-## An example cell
-
-With MyST Markdown, you can define code cells with a directive like so:
-
-```{code-cell}
-print(2 + 2)
-```
-
-When your book is built, the contents of any `{code-cell}` blocks will be
-executed with your default Jupyter kernel, and their outputs will be displayed
-in-line with the rest of your content.
-
-```{seealso}
-Jupyter Book uses [Jupytext](https://jupytext.readthedocs.io/en/latest/) to convert text-based files to notebooks, and can support [many other text-based notebook files](https://jupyterbook.org/file-types/jupytext.html).
-```
-
-## Create a notebook with MyST Markdown
-
-MyST Markdown notebooks are defined by two things:
-
-1. YAML metadata that is needed to understand if / how it should convert text files to notebooks (including information about the kernel needed).
- See the YAML at the top of this page for example.
-2. The presence of `{code-cell}` directives, which will be executed with your book.
-
-That's all that is needed to get started!
-
-## Quickly add YAML metadata for MyST Notebooks
-
-If you have a markdown file and you'd like to quickly add YAML metadata to it, so that Jupyter Book will treat it as a MyST Markdown Notebook, run the following command:
-
-```
-jupyter-book myst init path/to/markdownfile.md
-```
\ No newline at end of file
diff --git a/docs/markdown.md b/docs/markdown.md
deleted file mode 100644
index deaf054..0000000
--- a/docs/markdown.md
+++ /dev/null
@@ -1,55 +0,0 @@
-# Markdown Files
-
-Whether you write your book's content in Jupyter Notebooks (`.ipynb`) or
-in regular markdown files (`.md`), you'll write in the same flavor of markdown
-called **MyST Markdown**.
-This is a simple file to help you get started and show off some syntax.
-
-## What is MyST?
-
-MyST stands for "Markedly Structured Text". It
-is a slight variation on a flavor of markdown called "CommonMark" markdown,
-with small syntax extensions to allow you to write **roles** and **directives**
-in the Sphinx ecosystem.
-
-For more about MyST, see [the MyST Markdown Overview](https://jupyterbook.org/content/myst.html).
-
-## Sample Roles and Directives
-
-Roles and directives are two of the most powerful tools in Jupyter Book. They
-are kind of like functions, but written in a markup language. They both
-serve a similar purpose, but **roles are written in one line**, whereas
-**directives span many lines**. They both accept different kinds of inputs,
-and what they do with those inputs depends on the specific role or directive
-that is being called.
-
-Here is a "note" directive:
-
-```{note}
-Here is a note
-```
-
-It will be rendered in a special box when you build your book.
-
-Here is an inline directive to refer to a document: {doc}`markdown-notebooks`.
-
-
-## Citations
-
-You can also cite references that are stored in a `bibtex` file. For example,
-the following syntax: `` {cite}`holdgraf_evidence_2014` `` will render like
-this: {cite}`holdgraf_evidence_2014`.
-
-Moreover, you can insert a bibliography into your page with this syntax:
-The `{bibliography}` directive must be used for all the `{cite}` roles to
-render properly.
-For example, if the references for your book are stored in `references.bib`,
-then the bibliography is inserted with:
-
-```{bibliography}
-```
-
-## Learn more
-
-This is just a simple starter to get you started.
-You can learn a lot more at [jupyterbook.org](https://jupyterbook.org).
\ No newline at end of file
diff --git a/docs/nb/Bluetooth sensor.ipynb b/docs/nb/Bluetooth sensor.ipynb
new file mode 100644
index 0000000..a2c2c72
--- /dev/null
+++ b/docs/nb/Bluetooth sensor.ipynb
@@ -0,0 +1,2306 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "a1ca17a0-128e-46b7-b65d-011116b44d28",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "# Bluetooth Sensor\n",
+ "The system to be analyzed in this tutorial is a very simple one: A battery operated Bluetooth sensor. \n",
+ "The system consists of the following components:\n",
+ " * A CR2032 3V lithium battery\n",
+ " * A MCU operating at 1.8V\n",
+ " * A sensor that needs 5V to operate\n",
+ "\n",
+ "To power the MCU and sensor from the 3V battery two converters are needed: \n",
+ " * A boost converter that outputs 5V. The 5V is filtered with an RC filter to reduce switching noise.\n",
+ " * A buck converter that outputs 1.8V\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "0ddf2bf4-d388-4195-aaaa-c0a4969b02b0",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": [
+ "remove-cell"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "# This cell can be removed, it is only used for running the notebook during Sphinx documentation build.\n",
+ "import sys, os\n",
+ "if os.getcwd().replace('\\\\', '/').endswith(\"/docs/nb\"):\n",
+ " sys.path.insert(0, os.path.abspath(os.path.join(\"../../src\")))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "3555e267-3e0a-4c54-8611-f498f616146e",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "from sysloss.components import *\n",
+ "from sysloss.system import System"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3e9ec23a-db71-4f10-acac-81928ed90913",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "## Define the system\n",
+ "A sysloss system is defined using the System class. Components are added to the system, always starting with a Source component (in this case the battery). Each component must have a unique name. \n",
+ "\n",
+ "Parameters for voltage, current, power and resistance are always in basic units of electricity (Volt, Ampere, Watt and Ohm).\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "04d7771f-09e0-42b5-936f-d5481aebe7f3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "bts = System(\"Bluetooth sensor\", Source(\"CR2032\", vo=3.0, rs=10))\n",
+ "bts.add_comp(\"CR2032\", comp=Converter(\"Buck 1.8V\", vo=1.8, eff=0.87))\n",
+ "bts.add_comp(\"Buck 1.8V\", comp=PLoad(\"MCU\", pwr=13e-3))\n",
+ "bts.add_comp(\"CR2032\", comp=Converter(\"Boost 5V\", vo=5.0, eff=0.82, iis=3e-6))\n",
+ "bts.add_comp(\"Boost 5V\", comp=RLoss(\"RC filter\", rs=6.8))\n",
+ "bts.add_comp(\"RC filter\", comp=ILoad(\"Sensor\", ii=6e-3))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1c895bcd-ec85-4fff-ba8b-80d810e7469a",
+ "metadata": {},
+ "source": [
+ "That's it - for the initial system! sysloss has two functions for summarizing the system:\n",
+ " * *.tree()* that displays the power tree structure\n",
+ " * *.params()* that lists all system parameters in a Pandas frame"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "672b2393-2e1c-4aab-b688-140db460aa7c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "Bluetooth sensor\n",
+ "└── CR2032\n",
+ " ├── Boost 5V\n",
+ " │ └── RC filter\n",
+ " │ └── Sensor\n",
+ " └── Buck 1.8V\n",
+ " └── MCU\n",
+ " \n"
+ ],
+ "text/plain": [
+ "Bluetooth sensor\n",
+ "└── CR2032\n",
+ " ├── Boost 5V\n",
+ " │ └── RC filter\n",
+ " │ └── Sensor\n",
+ " └── Buck 1.8V\n",
+ " └── MCU\n"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "bts.tree()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "d0aa30c3-a545-4ed3-a836-8fcf53bdf0e2",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Component \n",
+ " Type \n",
+ " Parent \n",
+ " vo (V) \n",
+ " vdrop (V) \n",
+ " rs (Ohm) \n",
+ " eff (%) \n",
+ " iq (A) \n",
+ " ii (A) \n",
+ " iis (A) \n",
+ " pwr (W) \n",
+ " pwrs (W) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " CR2032 \n",
+ " SOURCE \n",
+ " \n",
+ " 3.0 \n",
+ " \n",
+ " 10 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " Boost 5V \n",
+ " CONVERTER \n",
+ " CR2032 \n",
+ " 5.0 \n",
+ " \n",
+ " \n",
+ " 0.82 \n",
+ " 0.0 \n",
+ " \n",
+ " 0.000003 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " RC filter \n",
+ " SLOSS \n",
+ " Boost 5V \n",
+ " \n",
+ " \n",
+ " 6.8 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " Sensor \n",
+ " LOAD \n",
+ " RC filter \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0.006 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " Buck 1.8V \n",
+ " CONVERTER \n",
+ " CR2032 \n",
+ " 1.8 \n",
+ " \n",
+ " \n",
+ " 0.87 \n",
+ " 0.0 \n",
+ " \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " MCU \n",
+ " LOAD \n",
+ " Buck 1.8V \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0.013 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Component Type Parent vo (V) vdrop (V) rs (Ohm) eff (%) iq (A) \\\n",
+ "0 CR2032 SOURCE 3.0 10 \n",
+ "1 Boost 5V CONVERTER CR2032 5.0 0.82 0.0 \n",
+ "2 RC filter SLOSS Boost 5V 6.8 \n",
+ "3 Sensor LOAD RC filter \n",
+ "4 Buck 1.8V CONVERTER CR2032 1.8 0.87 0.0 \n",
+ "5 MCU LOAD Buck 1.8V \n",
+ "\n",
+ " ii (A) iis (A) pwr (W) pwrs (W) \n",
+ "0 \n",
+ "1 0.000003 \n",
+ "2 \n",
+ "3 0.006 0.0 \n",
+ "4 0.0 \n",
+ "5 0.013 0.0 "
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "bts.params()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cce1bac1-f7ed-434e-a380-19d2dfb752ce",
+ "metadata": {},
+ "source": [
+ "## Analyze\n",
+ "We can now analyze the steady-state of this system with *.solve()*, which returns the system state in a Pandas frame."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "42ae1137-3488-4877-bde9-b374a72d4140",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Component \n",
+ " Type \n",
+ " Parent \n",
+ " Vin (V) \n",
+ " Vout (V) \n",
+ " Iin (A) \n",
+ " Iout (A) \n",
+ " Power (W) \n",
+ " Loss (W) \n",
+ " Efficiency (%) \n",
+ " Warnings \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " CR2032 \n",
+ " SOURCE \n",
+ " \n",
+ " 3.0 \n",
+ " 2.817088 \n",
+ " 0.018291 \n",
+ " 0.018291 \n",
+ " 0.054874 \n",
+ " 0.003346 \n",
+ " 93.902943 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " Boost 5V \n",
+ " CONVERTER \n",
+ " CR2032 \n",
+ " 2.817088 \n",
+ " 5.0 \n",
+ " 0.012987 \n",
+ " 0.006 \n",
+ " 0.036585 \n",
+ " 0.006585 \n",
+ " 82.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " RC filter \n",
+ " SLOSS \n",
+ " Boost 5V \n",
+ " 5.0 \n",
+ " 4.9592 \n",
+ " 0.006 \n",
+ " 0.006 \n",
+ " 0.03 \n",
+ " 0.000245 \n",
+ " 99.184 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " Sensor \n",
+ " LOAD \n",
+ " RC filter \n",
+ " 4.9592 \n",
+ " 0.0 \n",
+ " 0.006 \n",
+ " 0.0 \n",
+ " 0.029755 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " Buck 1.8V \n",
+ " CONVERTER \n",
+ " CR2032 \n",
+ " 2.817088 \n",
+ " 1.8 \n",
+ " 0.005304 \n",
+ " 0.007222 \n",
+ " 0.014943 \n",
+ " 0.001943 \n",
+ " 87.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " MCU \n",
+ " LOAD \n",
+ " Buck 1.8V \n",
+ " 1.8 \n",
+ " 0.0 \n",
+ " 0.007222 \n",
+ " 0.0 \n",
+ " 0.013 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " System total \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0.054874 \n",
+ " 0.012118 \n",
+ " 77.915822 \n",
+ " \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Component Type Parent Vin (V) Vout (V) Iin (A) Iout (A) \\\n",
+ "0 CR2032 SOURCE 3.0 2.817088 0.018291 0.018291 \n",
+ "1 Boost 5V CONVERTER CR2032 2.817088 5.0 0.012987 0.006 \n",
+ "2 RC filter SLOSS Boost 5V 5.0 4.9592 0.006 0.006 \n",
+ "3 Sensor LOAD RC filter 4.9592 0.0 0.006 0.0 \n",
+ "4 Buck 1.8V CONVERTER CR2032 2.817088 1.8 0.005304 0.007222 \n",
+ "5 MCU LOAD Buck 1.8V 1.8 0.0 0.007222 0.0 \n",
+ "6 System total \n",
+ "\n",
+ " Power (W) Loss (W) Efficiency (%) Warnings \n",
+ "0 0.054874 0.003346 93.902943 \n",
+ "1 0.036585 0.006585 82.0 \n",
+ "2 0.03 0.000245 99.184 \n",
+ "3 0.029755 0.0 100.0 \n",
+ "4 0.014943 0.001943 87.0 \n",
+ "5 0.013 0.0 100.0 \n",
+ "6 0.054874 0.012118 77.915822 "
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "bts.solve()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "358a3f65-dd89-484a-b3fd-767919d135f1",
+ "metadata": {},
+ "source": [
+ "## Load phases\n",
+ "Very few systems operate with constant power. Most systems will have two or more operating modes, where different parts of the system is shut-down or operating at lower or higher power. Our Bluetooth sensor will acquire and transmit sensor data once per hour and stay in sleep mode otherwise. \n",
+ "\n",
+ "sysloss captures these operating modes with *load phases*. We define three phases:\n",
+ " * \"sleep\": the 5V boost converter is shut-down (and the sensor with it). MCU is sleeping.\n",
+ " * \"acquire\": the 5V boost converter is enabled, MCU is acquiring sensor data.\n",
+ " * \"transmit\": the MCU uses higher power to transmit sensor data, while the 5V boost converter is shut-down.\n",
+ "\n",
+ "Load phases in sysloss are defined in a dict with name and duration (seconds) of each phase. The duration values are used to calculate time-averaged power numbers. We start by defining the load phases on system level.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "e3cc5eb3-f7f4-4afe-8a99-0cd243462379",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "bts_phases = {\"sleep\": 3600, \"acquire\": 2.5, \"transmit\": 2e-3}\n",
+ "bts.set_sys_phases(bts_phases)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0ff22d97-2f3c-475f-ac32-844786ec6122",
+ "metadata": {},
+ "source": [
+ "To define which load phases a converter is active in, we set the converter parameter *active_phases*, which is a list of phases. \n",
+ "```{tip}\n",
+ "When a converter is shut-down, the output voltage is 0.0, and all components connected to it will be off too. There is no need to define load phases for those components.\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "764d696e-1ca0-4c6f-8d17-f1d358efc2e8",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "bts.set_comp_phases(\"Boost 5V\", phase_conf=[\"acquire\"])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7eb80e85-ab97-4328-97c8-94505f73b8d6",
+ "metadata": {},
+ "source": [
+ "Next, we set the load phases for the MCU, which has different power for each phase. For load components the load phase power consumption is defined as a dict."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "db9dd7fe-b5e4-4c8e-8a6c-bc9fa66ca524",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "mcu_pwr = {\"sleep\": 12e-6, \"acquire\": 15e-3, \"transmit\": 35e-3}\n",
+ "bts.set_comp_phases(\"MCU\", phase_conf=mcu_pwr)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9b20170b-11e5-432a-84f2-e54f5e9598db",
+ "metadata": {},
+ "source": [
+ "The *.phases()* function returns a DataFrame with the load phases summarized:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "6c720555-c251-4608-b559-30385dd3ef2c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Component \n",
+ " Type \n",
+ " Parent \n",
+ " Active phase \n",
+ " rs (Ohm) \n",
+ " ii (A) \n",
+ " pwr (W) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " CR2032 \n",
+ " SOURCE \n",
+ " \n",
+ " None \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " Boost 5V \n",
+ " CONVERTER \n",
+ " CR2032 \n",
+ " acquire \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " RC filter \n",
+ " SLOSS \n",
+ " Boost 5V \n",
+ " None \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " Sensor \n",
+ " LOAD \n",
+ " RC filter \n",
+ " N/A \n",
+ " \n",
+ " 0.006 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " Buck 1.8V \n",
+ " CONVERTER \n",
+ " CR2032 \n",
+ " N/A \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " MCU \n",
+ " LOAD \n",
+ " Buck 1.8V \n",
+ " sleep \n",
+ " \n",
+ " \n",
+ " 0.000012 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " MCU \n",
+ " LOAD \n",
+ " Buck 1.8V \n",
+ " acquire \n",
+ " \n",
+ " \n",
+ " 0.015 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " MCU \n",
+ " LOAD \n",
+ " Buck 1.8V \n",
+ " transmit \n",
+ " \n",
+ " \n",
+ " 0.035 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Component Type Parent Active phase rs (Ohm) ii (A) pwr (W)\n",
+ "0 CR2032 SOURCE None \n",
+ "1 Boost 5V CONVERTER CR2032 acquire \n",
+ "2 RC filter SLOSS Boost 5V None \n",
+ "3 Sensor LOAD RC filter N/A 0.006 \n",
+ "4 Buck 1.8V CONVERTER CR2032 N/A \n",
+ "5 MCU LOAD Buck 1.8V sleep 0.000012\n",
+ "6 MCU LOAD Buck 1.8V acquire 0.015\n",
+ "7 MCU LOAD Buck 1.8V transmit 0.035"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "bts.phases()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cf77fff3-ee6c-4899-bc79-13b869b531e7",
+ "metadata": {},
+ "source": [
+ "Analyzing again:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "f6118236-22a6-4f94-92a1-b0fe8a1d2b79",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Component \n",
+ " Type \n",
+ " Parent \n",
+ " Phase \n",
+ " Vin (V) \n",
+ " Vout (V) \n",
+ " Iin (A) \n",
+ " Iout (A) \n",
+ " Power (W) \n",
+ " Loss (W) \n",
+ " Efficiency (%) \n",
+ " Warnings \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " CR2032 \n",
+ " SOURCE \n",
+ " \n",
+ " sleep \n",
+ " 3.0 \n",
+ " 2.999924 \n",
+ " 0.000008 \n",
+ " 0.000008 \n",
+ " 0.000023 \n",
+ " 0.0 \n",
+ " 99.997467 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " Boost 5V \n",
+ " CONVERTER \n",
+ " CR2032 \n",
+ " sleep \n",
+ " 2.999924 \n",
+ " 0.0 \n",
+ " 0.000003 \n",
+ " 0.0 \n",
+ " 0.000009 \n",
+ " 0.000009 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " RC filter \n",
+ " SLOSS \n",
+ " Boost 5V \n",
+ " sleep \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " Sensor \n",
+ " LOAD \n",
+ " RC filter \n",
+ " sleep \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " Buck 1.8V \n",
+ " CONVERTER \n",
+ " CR2032 \n",
+ " sleep \n",
+ " 2.999924 \n",
+ " 1.8 \n",
+ " 0.000005 \n",
+ " 0.000007 \n",
+ " 0.000014 \n",
+ " 0.000002 \n",
+ " 87.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " MCU \n",
+ " LOAD \n",
+ " Buck 1.8V \n",
+ " sleep \n",
+ " 1.8 \n",
+ " 0.0 \n",
+ " 0.000007 \n",
+ " 0.0 \n",
+ " 0.000012 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " System total \n",
+ " \n",
+ " \n",
+ " sleep \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0.000023 \n",
+ " 0.000011 \n",
+ " 52.646258 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " CR2032 \n",
+ " SOURCE \n",
+ " \n",
+ " acquire \n",
+ " 3.0 \n",
+ " 2.808332 \n",
+ " 0.019167 \n",
+ " 0.019167 \n",
+ " 0.0575 \n",
+ " 0.003674 \n",
+ " 93.611075 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " Boost 5V \n",
+ " CONVERTER \n",
+ " CR2032 \n",
+ " acquire \n",
+ " 2.808332 \n",
+ " 5.0 \n",
+ " 0.013027 \n",
+ " 0.006 \n",
+ " 0.036585 \n",
+ " 0.006585 \n",
+ " 82.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " RC filter \n",
+ " SLOSS \n",
+ " Boost 5V \n",
+ " acquire \n",
+ " 5.0 \n",
+ " 4.9592 \n",
+ " 0.006 \n",
+ " 0.006 \n",
+ " 0.03 \n",
+ " 0.000245 \n",
+ " 99.184 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " Sensor \n",
+ " LOAD \n",
+ " RC filter \n",
+ " acquire \n",
+ " 4.9592 \n",
+ " 0.0 \n",
+ " 0.006 \n",
+ " 0.0 \n",
+ " 0.029755 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " Buck 1.8V \n",
+ " CONVERTER \n",
+ " CR2032 \n",
+ " acquire \n",
+ " 2.808332 \n",
+ " 1.8 \n",
+ " 0.006139 \n",
+ " 0.008333 \n",
+ " 0.017241 \n",
+ " 0.002241 \n",
+ " 87.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " MCU \n",
+ " LOAD \n",
+ " Buck 1.8V \n",
+ " acquire \n",
+ " 1.8 \n",
+ " 0.0 \n",
+ " 0.008333 \n",
+ " 0.0 \n",
+ " 0.015 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 13 \n",
+ " System total \n",
+ " \n",
+ " \n",
+ " acquire \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0.0575 \n",
+ " 0.012745 \n",
+ " 77.834565 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 14 \n",
+ " CR2032 \n",
+ " SOURCE \n",
+ " \n",
+ " transmit \n",
+ " 3.0 \n",
+ " 2.85927 \n",
+ " 0.014073 \n",
+ " 0.014073 \n",
+ " 0.042219 \n",
+ " 0.00198 \n",
+ " 95.309007 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 15 \n",
+ " Boost 5V \n",
+ " CONVERTER \n",
+ " CR2032 \n",
+ " transmit \n",
+ " 2.85927 \n",
+ " 0.0 \n",
+ " 0.000003 \n",
+ " 0.0 \n",
+ " 0.000009 \n",
+ " 0.000009 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 16 \n",
+ " RC filter \n",
+ " SLOSS \n",
+ " Boost 5V \n",
+ " transmit \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 17 \n",
+ " Sensor \n",
+ " LOAD \n",
+ " RC filter \n",
+ " transmit \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " Buck 1.8V \n",
+ " CONVERTER \n",
+ " CR2032 \n",
+ " transmit \n",
+ " 2.85927 \n",
+ " 1.8 \n",
+ " 0.01407 \n",
+ " 0.019444 \n",
+ " 0.04023 \n",
+ " 0.00523 \n",
+ " 87.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 19 \n",
+ " MCU \n",
+ " LOAD \n",
+ " Buck 1.8V \n",
+ " transmit \n",
+ " 1.8 \n",
+ " 0.0 \n",
+ " 0.019444 \n",
+ " 0.0 \n",
+ " 0.035 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 20 \n",
+ " System total \n",
+ " \n",
+ " \n",
+ " transmit \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0.042219 \n",
+ " 0.007219 \n",
+ " 82.901156 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 21 \n",
+ " System average \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0.000063 \n",
+ " 0.00002 \n",
+ " 52.663754 \n",
+ " \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Component Type Parent Phase Vin (V) Vout (V) \\\n",
+ "0 CR2032 SOURCE sleep 3.0 2.999924 \n",
+ "1 Boost 5V CONVERTER CR2032 sleep 2.999924 0.0 \n",
+ "2 RC filter SLOSS Boost 5V sleep 0.0 0.0 \n",
+ "3 Sensor LOAD RC filter sleep 0.0 0.0 \n",
+ "4 Buck 1.8V CONVERTER CR2032 sleep 2.999924 1.8 \n",
+ "5 MCU LOAD Buck 1.8V sleep 1.8 0.0 \n",
+ "6 System total sleep \n",
+ "7 CR2032 SOURCE acquire 3.0 2.808332 \n",
+ "8 Boost 5V CONVERTER CR2032 acquire 2.808332 5.0 \n",
+ "9 RC filter SLOSS Boost 5V acquire 5.0 4.9592 \n",
+ "10 Sensor LOAD RC filter acquire 4.9592 0.0 \n",
+ "11 Buck 1.8V CONVERTER CR2032 acquire 2.808332 1.8 \n",
+ "12 MCU LOAD Buck 1.8V acquire 1.8 0.0 \n",
+ "13 System total acquire \n",
+ "14 CR2032 SOURCE transmit 3.0 2.85927 \n",
+ "15 Boost 5V CONVERTER CR2032 transmit 2.85927 0.0 \n",
+ "16 RC filter SLOSS Boost 5V transmit 0.0 0.0 \n",
+ "17 Sensor LOAD RC filter transmit 0.0 0.0 \n",
+ "18 Buck 1.8V CONVERTER CR2032 transmit 2.85927 1.8 \n",
+ "19 MCU LOAD Buck 1.8V transmit 1.8 0.0 \n",
+ "20 System total transmit \n",
+ "21 System average \n",
+ "\n",
+ " Iin (A) Iout (A) Power (W) Loss (W) Efficiency (%) Warnings \n",
+ "0 0.000008 0.000008 0.000023 0.0 99.997467 \n",
+ "1 0.000003 0.0 0.000009 0.000009 0.0 \n",
+ "2 0.0 0.0 0.0 0.0 100.0 \n",
+ "3 0.0 0.0 0.0 0.0 100.0 \n",
+ "4 0.000005 0.000007 0.000014 0.000002 87.0 \n",
+ "5 0.000007 0.0 0.000012 0.0 100.0 \n",
+ "6 0.000023 0.000011 52.646258 \n",
+ "7 0.019167 0.019167 0.0575 0.003674 93.611075 \n",
+ "8 0.013027 0.006 0.036585 0.006585 82.0 \n",
+ "9 0.006 0.006 0.03 0.000245 99.184 \n",
+ "10 0.006 0.0 0.029755 0.0 100.0 \n",
+ "11 0.006139 0.008333 0.017241 0.002241 87.0 \n",
+ "12 0.008333 0.0 0.015 0.0 100.0 \n",
+ "13 0.0575 0.012745 77.834565 \n",
+ "14 0.014073 0.014073 0.042219 0.00198 95.309007 \n",
+ "15 0.000003 0.0 0.000009 0.000009 0.0 \n",
+ "16 0.0 0.0 0.0 0.0 100.0 \n",
+ "17 0.0 0.0 0.0 0.0 100.0 \n",
+ "18 0.01407 0.019444 0.04023 0.00523 87.0 \n",
+ "19 0.019444 0.0 0.035 0.0 100.0 \n",
+ "20 0.042219 0.007219 82.901156 \n",
+ "21 0.000063 0.00002 52.663754 "
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "bts.solve()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "75115a12-6843-4a41-8d78-1a9d12e16a2a",
+ "metadata": {},
+ "source": [
+ "The result table now has a new column **Phase**, results for each phase and a system average row."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0d128d07-2d9e-4848-a5d1-3fa9a59ad157",
+ "metadata": {},
+ "source": [
+ "## Parameter interpolation\n",
+ "The converters in the system have been defined with constant efficiency. Converter efficiency is a function of many factors, including output current and input voltage. sysloss supports interpolation of converter efficiency. This means that we can take data points from the converter data sheet (or measurement data from a lab test) and provide these data points to sysloss as an interpolated parameter. sysloss will then connect the dots with 1D or 2D linear interpolation. \n",
+ "\n",
+ "Let us define the efficiency curve for the 1.8V buck converter. The data points are entered in a dict with a specific format:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "b896f244-16c1-4811-9609-321992fe7594",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "buck_eff = {\"vi\": [3.0], \"io\": [1e-6, 1e-5, 1e-4, 1e-3, 1e-2], \"eff\": [[0.72, 0.89, 0.92, 0.925, 0.93]]}\n",
+ "bts.change_comp(\"Buck 1.8V\", comp=Converter(\"Buck 1.8V\", vo=1.8, eff=buck_eff))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "6545492c-949f-4ede-8405-50f46f50d2c8",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Component \n",
+ " Type \n",
+ " Parent \n",
+ " vo (V) \n",
+ " vdrop (V) \n",
+ " rs (Ohm) \n",
+ " eff (%) \n",
+ " iq (A) \n",
+ " ii (A) \n",
+ " iis (A) \n",
+ " pwr (W) \n",
+ " pwrs (W) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " CR2032 \n",
+ " SOURCE \n",
+ " \n",
+ " 3.0 \n",
+ " \n",
+ " 10 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " Boost 5V \n",
+ " CONVERTER \n",
+ " CR2032 \n",
+ " 5.0 \n",
+ " \n",
+ " \n",
+ " 0.82 \n",
+ " 0.0 \n",
+ " \n",
+ " 0.000003 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " RC filter \n",
+ " SLOSS \n",
+ " Boost 5V \n",
+ " \n",
+ " \n",
+ " 6.8 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " Sensor \n",
+ " LOAD \n",
+ " RC filter \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0.006 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " Buck 1.8V \n",
+ " CONVERTER \n",
+ " CR2032 \n",
+ " 1.8 \n",
+ " \n",
+ " \n",
+ " interp \n",
+ " 0.0 \n",
+ " \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " MCU \n",
+ " LOAD \n",
+ " Buck 1.8V \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0.013 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Component Type Parent vo (V) vdrop (V) rs (Ohm) eff (%) iq (A) \\\n",
+ "0 CR2032 SOURCE 3.0 10 \n",
+ "1 Boost 5V CONVERTER CR2032 5.0 0.82 0.0 \n",
+ "2 RC filter SLOSS Boost 5V 6.8 \n",
+ "3 Sensor LOAD RC filter \n",
+ "4 Buck 1.8V CONVERTER CR2032 1.8 interp 0.0 \n",
+ "5 MCU LOAD Buck 1.8V \n",
+ "\n",
+ " ii (A) iis (A) pwr (W) pwrs (W) \n",
+ "0 \n",
+ "1 0.000003 \n",
+ "2 \n",
+ "3 0.006 0.0 \n",
+ "4 0.0 \n",
+ "5 0.013 0.0 "
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "bts.params()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "44e6c1ea-a4d1-49d1-bf4b-cf51099324a6",
+ "metadata": {},
+ "source": [
+ "If we look in the parameter table now, the entry for \"Buck 1.8V\" efficiency is *interp*, which means an interpolated parameter. We can also plot the interpolation curve with the *.plot_interp()* method:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "6ef5c7f4-e0d7-4c76-8380-ca5ce67fdc33",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlEAAAHFCAYAAADSY6wWAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAABTp0lEQVR4nO3deVxUVeMG8GdmGDYFXFAWIUSx3BXBBUxNU0hNs5++aaVpYmqaC5amr765lJm9b2qZUvYi5JKaqZVvaqKZS+IaaKmllrvgruACzHJ+f+CMDDMgXIa53PH5fj58nLlz5t5zD0PzdM6556qEEAJEREREVCpquStAREREpEQMUUREREQSMEQRERERScAQRURERCQBQxQRERGRBAxRRERERBIwRBERERFJwBBFREREJAFDFBEREZEEDFHklJKTk6FSqSx+atSogaeeegr/+9//yvXY06ZNg0qlwtWrV0v93uzsbEyYMAExMTGoUaMGVCoVpk2bVqp9bNu2DV26dEHNmjVRuXJlNG3aFJ988gkMBgMA4NChQ1CpVJg4cWKR+zhx4gRUKhVGjx5d6nOw5fTp0+jevTuqVasGlUqFsWPHAgDS0tLQoUMH+Pj4QKVSYd68efj555+hUqnw888/l+oYpt/56dOn7VJnOU2ZMgWPPfYYXFxcUKVKlXI7Tnh4OGrVqmX+bNjStm1b+Pr6Ii8vr9zqATjvZ5+cG0MUObWkpCSkpqZi9+7dWLRoETQaDXr06IH169fLXTWbrl27hkWLFiE3Nxe9evUq9fu3bNmCzp07Q6/X44svvsC3336Lp556CmPGjMG4ceMAAM2aNUNERASWLFlS5JdnUlISACAuLk7yuRQUHx+PvXv3YvHixUhNTUV8fDwAYPDgwcjIyMDKlSuRmpqKfv36oUWLFkhNTUWLFi1KdYzu3bsjNTUVAQEBdqmzXL777jvMnDkTr7zyCrZv344tW7aU27Hi4uJw8eJF/PjjjzZfP378OHbv3o0BAwbA1dW13OoBOO9nn5ycIHJCSUlJAoDYv3+/xfa7d+8KNzc38eKLL5bbsadOnSoAiCtXrpT6vUajURiNRiGEEFeuXBEAxNSpU0v8/pdfflm4ubmJ27dvW2yPiYkR3t7e5ucLFy4UAMT69eut9qHX60WtWrVEREREqetflLCwMNG1a1er7S4uLuL111+323GcwXvvvScAiEuXLtltn3fu3LG5/fr168Ld3V307t3b5utvv/22ACAOHz5st7oUxVk/++Tc2BNFjxR3d3e4urpCq9WatxU1fHT69GmoVCokJydbbN+7dy969OiB6tWrw93dHXXr1jUPTxXljz/+QJ06ddC6dWtcvny5yHKmoUeptFotXF1d4eHhYbG9SpUqcHd3Nz9/6aWX4OHhYf6/7oI2b96MCxcuYPDgwQ89XmZmJoYNG4agoCC4uroiNDQU06dPh16vB/CgbU+ePImNGzeaz8809KbX65GQkGBx3kX9Ph7W7kUN523ZsgVPP/00vL294enpibZt22Lr1q0WZUxDsEeOHMGLL74IHx8f+Pn5YfDgwbh165ZFWaPRiPnz56N58+bw8PBAlSpV0KZNG3z//fcA8nswqlWrhrt371q1V6dOndCoUaMi27N27dqYMmUKAMDPz89iSMtoNOLDDz9E/fr14ebmhpo1a+KVV17B+fPnLfbx1FNPoXHjxtixYweio6Ph6elZ5O+yatWqeP7557F+/Xpcu3bN4jWDwYClS5eiZcuWaNKkCQBg165dePrpp+Hl5QVPT09ER0fjhx9+KPJ8SkNpn30igMN55OQMBgP0ej10Oh3Onz+PsWPH4s6dO3jppZck7e/HH39Eu3btcPbsWcyZMwcbN27ElClTcOnSpSLfs337dkRHR6Np06bYtm0batasKfV0Hmr48OHIy8vD6NGjcfHiRdy8eRNLly7FunXrMGHCBHM5Hx8f9O7dG+vXr8eVK1cs9pGUlAR3d/eHtlFmZiZatWqFH3/8Ee+88w42btyIuLg4zJo1C6+99hoAmIfm/P390bZtW6SmpiI1NRVdu3ZFamoqAKBPnz7m7UWR0u4AsGzZMsTExMDb2xtffvklvv76a1SrVg2xsbFWQQoAevfujccffxxr1qzBxIkT8dVXX5mHHk0GDRqEMWPGoGXLlli1ahVWrlyJnj17msPbmDFjcOPGDXz11VcW7zt69Ci2bduGkSNHFlnfdevWmYeRNm3ahNTUVAwZMgQA8Prrr+Ptt99Gly5d8P333+Pdd9/Fpk2bEB0dbTX/LiMjA/3798dLL72EDRs2YMSIEUUeMy4uDnl5eVi2bJnF9h9//BEXL14012f79u3o1KkTbt26hcTERKxYsQJeXl7o0aMHVq1aZfFevV5foh8hRJH1Ki1HfvaJzOTuCiMqD6bhvMI/bm5uYuHChRZlt23bJgCIbdu2WWw/deqUACCSkpLM2+rWrSvq1q0r7t27V+SxCw7nLV26VLi6uorRo0cLg8FQqnOQMqQhhBC//PKLCAwMNJ+zRqMRH374oVU503nPmTPHvO3atWvCzc1NvPzyyw89zrBhw0TlypXFmTNnLLb/5z//EQDEkSNHzNtCQkJE9+7drfYBQIwcOdJmvQr+PkrS7qbf+alTp4QQ+UNY1apVEz169LAoZzAYRLNmzUSrVq3M20y/s8LtNGLECOHu7m4eZtqxY4cAICZPnlxkPYQQokOHDqJ58+YW215//XXh7e0tsrOzi32vreHgY8eOCQBixIgRFmX37t0rAIh//vOfFscGILZu3VrscUyMRqMIDQ0VTZs2tdjeu3dv4enpKW7duiWEEKJNmzaiZs2aFvXX6/WicePGIigoyNxGpr+bkvwU/pszqeiffSIT9kSRU1uyZAn279+P/fv3Y+PGjRg4cCBGjhyJTz/9tNT7On78OP766y/ExcVZDA8UZebMmRg0aBA++OADfPzxx1Cry//P7eDBg3j++ecRERGB9evX46effsKkSZMwZcoUvPvuuxZlO3TogLp161oMayxfvhy5ubklGs743//+h44dOyIwMNCid6Fr164A8nsu7KG07W6ye/duXL9+HQMHDrSon9FoxDPPPIP9+/fjzp07Fu/p2bOnxfOmTZsiJyfHPAS7ceNGACi2NwnI741KT0/HL7/8AgDIysrC0qVLMXDgQFSuXLnE52Cybds2APm9YAW1atUKDRo0sOpVq1q1Kjp16lSifatUKrz66qs4fPgwDh48CCB/kvf69evRu3dveHt7486dO9i7dy/69OljUX+NRoMBAwbg/Pnz+PPPPwEAgYGB5r+5h/1ERESUui2K4sjPPpGJi9wVICpPDRo0QGRkpPn5M888gzNnzmDChAno379/qS4fN3X9BwUFlaj8smXLUKtWLfTr169UdS6LkSNHws/PD+vWrYNGowEAdOzYEWq1GtOmTcPLL7+MOnXqAMj/8hw8eDAmT56MAwcOIDIyEklJSQgNDUXHjh0feqxLly5h/fr1FvPLCpKyxIMtpW13E9NQX58+fYosc/36dVSqVMn8vHr16havu7m5AQDu3btnrotGo4G/v3+xx37uuedQu3ZtLFiw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dClmzJhh7/o6BSHy0xOH84iIiJRL0orlAQEBMBqNePHFF7Fv3z40b97cqkxsbCyqVKlSxuo5J/ZEERERKZ+kEDV37lz84x//gLu7e5FlqlatilOnTkmumDMzhSjOiSIiIlIuScN5PXv2xN27d622X79+HVlZWWWulLPjvfOIiIiUT1KI6tevH1auXGm1/euvv0a/fv3KXClnx+E8IiIi5ZMUovbu3YuOHTtabX/qqaewd+/eMlfK2RnZE0VERKR4kkJUbm4u9Hq91XadTod79+6VuVLO7sGcKFmrQURERGUgKUS1bNkSixYtstr+2WefISIiosyVcnacE0VERKR8kq7OmzlzJjp37oxDhw7h6aefBgBs3boV+/fvx+bNm+1aQWfE274QEREpn6SeqLZt2yI1NRXBwcH4+uuvsX79eoSFheHw4cNo166dvevodB70RMlbDyIiIpJOUk8UADRv3hzLly+3Z10eGVwnioiISPkkhyij0YiTJ0/i8uXLMBqNFq+1b9++zBVzZlzigIiISPkkhag9e/bgpZdewpkzZyBMY1P3qVQqGAwGu1TOWZmH85iiiIiIFEtSiBo+fDgiIyPxww8/ICAggMNSpWTqt2OGIiIiUi5JIerEiRP45ptvEBYWZu/6PBJMPVEMn0RERMol6eq81q1b4+TJk/auyyPDPLFc1loQERFRWUjqiRo1ahTefPNNZGZmokmTJtBqtRavN23a1C6Vc1ZcbJOIiEj5JIWo3r17AwAGDx5s3qZSqSCE4MTyEuBim0RERMonKUSdOnXK3vV4pPDeeURERMonKUSFhITYux6PFA7nERERKZ+kieUAsHTpUrRt2xaBgYE4c+YMAGDevHn47rvv7FY5Z2UezpPc+kRERCQ3SV/jCQkJGDduHLp164abN2+a50BVqVIF8+bNs2f9nBJ7ooiIiJRPUoiaP38+vvjiC0yePBkajca8PTIyEr/99pvdKueseNsXIiIi5ZMUok6dOoXw8HCr7W5ubrhz506ZK+XsuNgmERGR8kkKUaGhoUhPT7favnHjRjRs2LCsdXJ6XOKAiIhI+SRdnTd+/HiMHDkSOTk5EEJg3759WLFiBWbNmoX//ve/9q6j0+G984iIiJRPUoh69dVXodfrMWHCBNy9excvvfQSatWqhY8//hj9+vWzdx2dDieWExERKZ+kEAUAr732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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "bts.plot_interp(\"Buck 1.8V\");"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "id": "7973970c-9aaf-445b-9eae-289e141e6e7b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Component \n",
+ " Type \n",
+ " Parent \n",
+ " Phase \n",
+ " Vin (V) \n",
+ " Vout (V) \n",
+ " Iin (A) \n",
+ " Iout (A) \n",
+ " Power (W) \n",
+ " Loss (W) \n",
+ " Efficiency (%) \n",
+ " Warnings \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " CR2032 \n",
+ " SOURCE \n",
+ " \n",
+ " sleep \n",
+ " 3.0 \n",
+ " 2.999922 \n",
+ " 0.000008 \n",
+ " 0.000008 \n",
+ " 0.000024 \n",
+ " 0.0 \n",
+ " 99.997388 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " Boost 5V \n",
+ " CONVERTER \n",
+ " CR2032 \n",
+ " sleep \n",
+ " 2.999922 \n",
+ " 0.0 \n",
+ " 0.000003 \n",
+ " 0.0 \n",
+ " 0.000009 \n",
+ " 0.000009 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " RC filter \n",
+ " SLOSS \n",
+ " Boost 5V \n",
+ " sleep \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " Sensor \n",
+ " LOAD \n",
+ " RC filter \n",
+ " sleep \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " Buck 1.8V \n",
+ " CONVERTER \n",
+ " CR2032 \n",
+ " sleep \n",
+ " 2.999922 \n",
+ " 1.8 \n",
+ " 0.000005 \n",
+ " 0.000007 \n",
+ " 0.000015 \n",
+ " 0.000003 \n",
+ " 82.703704 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " MCU \n",
+ " LOAD \n",
+ " Buck 1.8V \n",
+ " sleep \n",
+ " 1.8 \n",
+ " 0.0 \n",
+ " 0.000007 \n",
+ " 0.0 \n",
+ " 0.000012 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " System total \n",
+ " \n",
+ " \n",
+ " sleep \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0.000024 \n",
+ " 0.000012 \n",
+ " 51.041607 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " CR2032 \n",
+ " SOURCE \n",
+ " \n",
+ " acquire \n",
+ " 3.0 \n",
+ " 2.812515 \n",
+ " 0.018748 \n",
+ " 0.018748 \n",
+ " 0.056245 \n",
+ " 0.003515 \n",
+ " 93.750503 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " Boost 5V \n",
+ " CONVERTER \n",
+ " CR2032 \n",
+ " acquire \n",
+ " 2.812515 \n",
+ " 5.0 \n",
+ " 0.013008 \n",
+ " 0.006 \n",
+ " 0.036585 \n",
+ " 0.006585 \n",
+ " 82.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " RC filter \n",
+ " SLOSS \n",
+ " Boost 5V \n",
+ " acquire \n",
+ " 5.0 \n",
+ " 4.9592 \n",
+ " 0.006 \n",
+ " 0.006 \n",
+ " 0.03 \n",
+ " 0.000245 \n",
+ " 99.184 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " Sensor \n",
+ " LOAD \n",
+ " RC filter \n",
+ " acquire \n",
+ " 4.9592 \n",
+ " 0.0 \n",
+ " 0.006 \n",
+ " 0.0 \n",
+ " 0.029755 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " Buck 1.8V \n",
+ " CONVERTER \n",
+ " CR2032 \n",
+ " acquire \n",
+ " 2.812515 \n",
+ " 1.8 \n",
+ " 0.00574 \n",
+ " 0.008333 \n",
+ " 0.016145 \n",
+ " 0.001145 \n",
+ " 92.907407 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " MCU \n",
+ " LOAD \n",
+ " Buck 1.8V \n",
+ " acquire \n",
+ " 1.8 \n",
+ " 0.0 \n",
+ " 0.008333 \n",
+ " 0.0 \n",
+ " 0.015 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 13 \n",
+ " System total \n",
+ " \n",
+ " \n",
+ " acquire \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0.056245 \n",
+ " 0.01149 \n",
+ " 79.571099 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 14 \n",
+ " CR2032 \n",
+ " SOURCE \n",
+ " \n",
+ " transmit \n",
+ " 3.0 \n",
+ " 2.868784 \n",
+ " 0.013122 \n",
+ " 0.013122 \n",
+ " 0.039365 \n",
+ " 0.001722 \n",
+ " 95.626137 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 15 \n",
+ " Boost 5V \n",
+ " CONVERTER \n",
+ " CR2032 \n",
+ " transmit \n",
+ " 2.868784 \n",
+ " 0.0 \n",
+ " 0.000003 \n",
+ " 0.0 \n",
+ " 0.000009 \n",
+ " 0.000009 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 16 \n",
+ " RC filter \n",
+ " SLOSS \n",
+ " Boost 5V \n",
+ " transmit \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 17 \n",
+ " Sensor \n",
+ " LOAD \n",
+ " RC filter \n",
+ " transmit \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " Buck 1.8V \n",
+ " CONVERTER \n",
+ " CR2032 \n",
+ " transmit \n",
+ " 2.868784 \n",
+ " 1.8 \n",
+ " 0.013119 \n",
+ " 0.019444 \n",
+ " 0.037634 \n",
+ " 0.002634 \n",
+ " 93.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 19 \n",
+ " MCU \n",
+ " LOAD \n",
+ " Buck 1.8V \n",
+ " transmit \n",
+ " 1.8 \n",
+ " 0.0 \n",
+ " 0.019444 \n",
+ " 0.0 \n",
+ " 0.035 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 20 \n",
+ " System total \n",
+ " \n",
+ " \n",
+ " transmit \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0.039365 \n",
+ " 0.004365 \n",
+ " 88.911973 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 21 \n",
+ " System average \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0.000063 \n",
+ " 0.000019 \n",
+ " 51.061426 \n",
+ " \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Component Type Parent Phase Vin (V) Vout (V) \\\n",
+ "0 CR2032 SOURCE sleep 3.0 2.999922 \n",
+ "1 Boost 5V CONVERTER CR2032 sleep 2.999922 0.0 \n",
+ "2 RC filter SLOSS Boost 5V sleep 0.0 0.0 \n",
+ "3 Sensor LOAD RC filter sleep 0.0 0.0 \n",
+ "4 Buck 1.8V CONVERTER CR2032 sleep 2.999922 1.8 \n",
+ "5 MCU LOAD Buck 1.8V sleep 1.8 0.0 \n",
+ "6 System total sleep \n",
+ "7 CR2032 SOURCE acquire 3.0 2.812515 \n",
+ "8 Boost 5V CONVERTER CR2032 acquire 2.812515 5.0 \n",
+ "9 RC filter SLOSS Boost 5V acquire 5.0 4.9592 \n",
+ "10 Sensor LOAD RC filter acquire 4.9592 0.0 \n",
+ "11 Buck 1.8V CONVERTER CR2032 acquire 2.812515 1.8 \n",
+ "12 MCU LOAD Buck 1.8V acquire 1.8 0.0 \n",
+ "13 System total acquire \n",
+ "14 CR2032 SOURCE transmit 3.0 2.868784 \n",
+ "15 Boost 5V CONVERTER CR2032 transmit 2.868784 0.0 \n",
+ "16 RC filter SLOSS Boost 5V transmit 0.0 0.0 \n",
+ "17 Sensor LOAD RC filter transmit 0.0 0.0 \n",
+ "18 Buck 1.8V CONVERTER CR2032 transmit 2.868784 1.8 \n",
+ "19 MCU LOAD Buck 1.8V transmit 1.8 0.0 \n",
+ "20 System total transmit \n",
+ "21 System average \n",
+ "\n",
+ " Iin (A) Iout (A) Power (W) Loss (W) Efficiency (%) Warnings \n",
+ "0 0.000008 0.000008 0.000024 0.0 99.997388 \n",
+ "1 0.000003 0.0 0.000009 0.000009 0.0 \n",
+ "2 0.0 0.0 0.0 0.0 100.0 \n",
+ "3 0.0 0.0 0.0 0.0 100.0 \n",
+ "4 0.000005 0.000007 0.000015 0.000003 82.703704 \n",
+ "5 0.000007 0.0 0.000012 0.0 100.0 \n",
+ "6 0.000024 0.000012 51.041607 \n",
+ "7 0.018748 0.018748 0.056245 0.003515 93.750503 \n",
+ "8 0.013008 0.006 0.036585 0.006585 82.0 \n",
+ "9 0.006 0.006 0.03 0.000245 99.184 \n",
+ "10 0.006 0.0 0.029755 0.0 100.0 \n",
+ "11 0.00574 0.008333 0.016145 0.001145 92.907407 \n",
+ "12 0.008333 0.0 0.015 0.0 100.0 \n",
+ "13 0.056245 0.01149 79.571099 \n",
+ "14 0.013122 0.013122 0.039365 0.001722 95.626137 \n",
+ "15 0.000003 0.0 0.000009 0.000009 0.0 \n",
+ "16 0.0 0.0 0.0 0.0 100.0 \n",
+ "17 0.0 0.0 0.0 0.0 100.0 \n",
+ "18 0.013119 0.019444 0.037634 0.002634 93.0 \n",
+ "19 0.019444 0.0 0.035 0.0 100.0 \n",
+ "20 0.039365 0.004365 88.911973 \n",
+ "21 0.000063 0.000019 51.061426 "
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "bts.solve()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d34c792a-a8e9-4ab7-814a-874536099e32",
+ "metadata": {},
+ "source": [
+ "The effect is not very large in this system, but the \"sleep\" efficiency is about 1.5% lower."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "86a70daf-f7ef-4add-8352-d25423363fdc",
+ "metadata": {},
+ "source": [
+ "## Saving and loading system from file\n",
+ "A system can be saved to .json format with the *.save()* method. Restore the system from file with the *.from_file()* method."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "id": "f87bbabf-680b-485f-9824-20ecc46f0837",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "bts.save(\"bts.json\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "id": "7dd5f072-f309-4347-aba8-40e5bbec3a8a",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Component \n",
+ " Type \n",
+ " Parent \n",
+ " Phase \n",
+ " Vin (V) \n",
+ " Vout (V) \n",
+ " Iin (A) \n",
+ " Iout (A) \n",
+ " Power (W) \n",
+ " Loss (W) \n",
+ " Efficiency (%) \n",
+ " Warnings \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " CR2032 \n",
+ " SOURCE \n",
+ " \n",
+ " sleep \n",
+ " 3.0 \n",
+ " 2.999922 \n",
+ " 0.000008 \n",
+ " 0.000008 \n",
+ " 0.000024 \n",
+ " 0.0 \n",
+ " 99.997388 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " Buck 1.8V \n",
+ " CONVERTER \n",
+ " CR2032 \n",
+ " sleep \n",
+ " 2.999922 \n",
+ " 1.8 \n",
+ " 0.000005 \n",
+ " 0.000007 \n",
+ " 0.000015 \n",
+ " 0.000003 \n",
+ " 82.703704 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " MCU \n",
+ " LOAD \n",
+ " Buck 1.8V \n",
+ " sleep \n",
+ " 1.8 \n",
+ " 0.0 \n",
+ " 0.000007 \n",
+ " 0.0 \n",
+ " 0.000012 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " Boost 5V \n",
+ " CONVERTER \n",
+ " CR2032 \n",
+ " sleep \n",
+ " 2.999922 \n",
+ " 0.0 \n",
+ " 0.000003 \n",
+ " 0.0 \n",
+ " 0.000009 \n",
+ " 0.000009 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " RC filter \n",
+ " SLOSS \n",
+ " Boost 5V \n",
+ " sleep \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " Sensor \n",
+ " LOAD \n",
+ " RC filter \n",
+ " sleep \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " System total \n",
+ " \n",
+ " \n",
+ " sleep \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0.000024 \n",
+ " 0.000012 \n",
+ " 51.041607 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " CR2032 \n",
+ " SOURCE \n",
+ " \n",
+ " acquire \n",
+ " 3.0 \n",
+ " 2.812515 \n",
+ " 0.018748 \n",
+ " 0.018748 \n",
+ " 0.056245 \n",
+ " 0.003515 \n",
+ " 93.750503 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " Buck 1.8V \n",
+ " CONVERTER \n",
+ " CR2032 \n",
+ " acquire \n",
+ " 2.812515 \n",
+ " 1.8 \n",
+ " 0.00574 \n",
+ " 0.008333 \n",
+ " 0.016145 \n",
+ " 0.001145 \n",
+ " 92.907407 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " MCU \n",
+ " LOAD \n",
+ " Buck 1.8V \n",
+ " acquire \n",
+ " 1.8 \n",
+ " 0.0 \n",
+ " 0.008333 \n",
+ " 0.0 \n",
+ " 0.015 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " Boost 5V \n",
+ " CONVERTER \n",
+ " CR2032 \n",
+ " acquire \n",
+ " 2.812515 \n",
+ " 5.0 \n",
+ " 0.013008 \n",
+ " 0.006 \n",
+ " 0.036585 \n",
+ " 0.006585 \n",
+ " 82.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " RC filter \n",
+ " SLOSS \n",
+ " Boost 5V \n",
+ " acquire \n",
+ " 5.0 \n",
+ " 4.9592 \n",
+ " 0.006 \n",
+ " 0.006 \n",
+ " 0.03 \n",
+ " 0.000245 \n",
+ " 99.184 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " Sensor \n",
+ " LOAD \n",
+ " RC filter \n",
+ " acquire \n",
+ " 4.9592 \n",
+ " 0.0 \n",
+ " 0.006 \n",
+ " 0.0 \n",
+ " 0.029755 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 13 \n",
+ " System total \n",
+ " \n",
+ " \n",
+ " acquire \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0.056245 \n",
+ " 0.01149 \n",
+ " 79.571099 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 14 \n",
+ " CR2032 \n",
+ " SOURCE \n",
+ " \n",
+ " transmit \n",
+ " 3.0 \n",
+ " 2.868784 \n",
+ " 0.013122 \n",
+ " 0.013122 \n",
+ " 0.039365 \n",
+ " 0.001722 \n",
+ " 95.626137 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 15 \n",
+ " Buck 1.8V \n",
+ " CONVERTER \n",
+ " CR2032 \n",
+ " transmit \n",
+ " 2.868784 \n",
+ " 1.8 \n",
+ " 0.013119 \n",
+ " 0.019444 \n",
+ " 0.037634 \n",
+ " 0.002634 \n",
+ " 93.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 16 \n",
+ " MCU \n",
+ " LOAD \n",
+ " Buck 1.8V \n",
+ " transmit \n",
+ " 1.8 \n",
+ " 0.0 \n",
+ " 0.019444 \n",
+ " 0.0 \n",
+ " 0.035 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 17 \n",
+ " Boost 5V \n",
+ " CONVERTER \n",
+ " CR2032 \n",
+ " transmit \n",
+ " 2.868784 \n",
+ " 0.0 \n",
+ " 0.000003 \n",
+ " 0.0 \n",
+ " 0.000009 \n",
+ " 0.000009 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " RC filter \n",
+ " SLOSS \n",
+ " Boost 5V \n",
+ " transmit \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 19 \n",
+ " Sensor \n",
+ " LOAD \n",
+ " RC filter \n",
+ " transmit \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 20 \n",
+ " System total \n",
+ " \n",
+ " \n",
+ " transmit \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0.039365 \n",
+ " 0.004365 \n",
+ " 88.911973 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 21 \n",
+ " System average \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0.000063 \n",
+ " 0.000019 \n",
+ " 51.061426 \n",
+ " \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Component Type Parent Phase Vin (V) Vout (V) \\\n",
+ "0 CR2032 SOURCE sleep 3.0 2.999922 \n",
+ "1 Buck 1.8V CONVERTER CR2032 sleep 2.999922 1.8 \n",
+ "2 MCU LOAD Buck 1.8V sleep 1.8 0.0 \n",
+ "3 Boost 5V CONVERTER CR2032 sleep 2.999922 0.0 \n",
+ "4 RC filter SLOSS Boost 5V sleep 0.0 0.0 \n",
+ "5 Sensor LOAD RC filter sleep 0.0 0.0 \n",
+ "6 System total sleep \n",
+ "7 CR2032 SOURCE acquire 3.0 2.812515 \n",
+ "8 Buck 1.8V CONVERTER CR2032 acquire 2.812515 1.8 \n",
+ "9 MCU LOAD Buck 1.8V acquire 1.8 0.0 \n",
+ "10 Boost 5V CONVERTER CR2032 acquire 2.812515 5.0 \n",
+ "11 RC filter SLOSS Boost 5V acquire 5.0 4.9592 \n",
+ "12 Sensor LOAD RC filter acquire 4.9592 0.0 \n",
+ "13 System total acquire \n",
+ "14 CR2032 SOURCE transmit 3.0 2.868784 \n",
+ "15 Buck 1.8V CONVERTER CR2032 transmit 2.868784 1.8 \n",
+ "16 MCU LOAD Buck 1.8V transmit 1.8 0.0 \n",
+ "17 Boost 5V CONVERTER CR2032 transmit 2.868784 0.0 \n",
+ "18 RC filter SLOSS Boost 5V transmit 0.0 0.0 \n",
+ "19 Sensor LOAD RC filter transmit 0.0 0.0 \n",
+ "20 System total transmit \n",
+ "21 System average \n",
+ "\n",
+ " Iin (A) Iout (A) Power (W) Loss (W) Efficiency (%) Warnings \n",
+ "0 0.000008 0.000008 0.000024 0.0 99.997388 \n",
+ "1 0.000005 0.000007 0.000015 0.000003 82.703704 \n",
+ "2 0.000007 0.0 0.000012 0.0 100.0 \n",
+ "3 0.000003 0.0 0.000009 0.000009 0.0 \n",
+ "4 0.0 0.0 0.0 0.0 100.0 \n",
+ "5 0.0 0.0 0.0 0.0 100.0 \n",
+ "6 0.000024 0.000012 51.041607 \n",
+ "7 0.018748 0.018748 0.056245 0.003515 93.750503 \n",
+ "8 0.00574 0.008333 0.016145 0.001145 92.907407 \n",
+ "9 0.008333 0.0 0.015 0.0 100.0 \n",
+ "10 0.013008 0.006 0.036585 0.006585 82.0 \n",
+ "11 0.006 0.006 0.03 0.000245 99.184 \n",
+ "12 0.006 0.0 0.029755 0.0 100.0 \n",
+ "13 0.056245 0.01149 79.571099 \n",
+ "14 0.013122 0.013122 0.039365 0.001722 95.626137 \n",
+ "15 0.013119 0.019444 0.037634 0.002634 93.0 \n",
+ "16 0.019444 0.0 0.035 0.0 100.0 \n",
+ "17 0.000003 0.0 0.000009 0.000009 0.0 \n",
+ "18 0.0 0.0 0.0 0.0 100.0 \n",
+ "19 0.0 0.0 0.0 0.0 100.0 \n",
+ "20 0.039365 0.004365 88.911973 \n",
+ "21 0.000063 0.000019 51.061426 "
+ ]
+ },
+ "execution_count": 17,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "bts2 = System.from_file(\"bts.json\")\n",
+ "bts2.solve()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "60a5ce3c-c0b4-4598-97f3-1b4680450519",
+ "metadata": {},
+ "source": [
+ "## Summary\n",
+ "This notebook demonstrates the basic use of sysLoss, including load phases, component parameter interpolation and saving and loading system from file."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "7a886bf9-2298-4195-afba-32d810886127",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "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.11.8"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/nb/Component files.ipynb b/docs/nb/Component files.ipynb
new file mode 100644
index 0000000..3c00cb7
--- /dev/null
+++ b/docs/nb/Component files.ipynb
@@ -0,0 +1,2185 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "a1ca17a0-128e-46b7-b65d-011116b44d28",
+ "metadata": {
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "# Component parameter files\n",
+ "Component parameters can be loaded from file (.toml format) rather than specifiying them in code when building a system. This enables a component library to be created from .toml files. This notebook demonstrates the component parameter files for each of the component types in `sysLoss`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "0ddf2bf4-d388-4195-aaaa-c0a4969b02b0",
+ "metadata": {
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": [
+ "remove-cell"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "# This cell can be removed, it is only used for running the notebook during Sphinx documentation build.\n",
+ "import sys, os\n",
+ "if os.getcwd().replace('\\\\', '/').endswith(\"/docs/nb\"):\n",
+ " sys.path.insert(0, os.path.abspath(os.path.join(\"../../src\")))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "85e3dec7-a1a4-4564-bceb-c6db7c6a5f27",
+ "metadata": {
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "Import packages:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "3555e267-3e0a-4c54-8611-f498f616146e",
+ "metadata": {
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "from sysloss.components import *\n",
+ "from sysloss.system import System\n",
+ "import toml"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3e9ec23a-db71-4f10-acac-81928ed90913",
+ "metadata": {
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "## About the .toml format\n",
+ "The general format of a component parameter file consists of two tables:\n",
+ " * \\[\\] \n",
+ " * component specific parameters\n",
+ " * \\[limits] (optional)\n",
+ " * limits for input and output voltages and currents\n",
+ "\n",
+ "`sysLoss` will silently ignore surplus parameters in the .toml file. Parameter files for each of the component types are detailed below.\n",
+ "```{tip}\n",
+ "TOML is picky on array values - a mix of integer and floating point values are not allowed. Always use floats! \n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "70d957e1-d4b0-4b3f-8c65-9d0b13187f6b",
+ "metadata": {},
+ "source": [
+ "## Source"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "7c385138-f993-4794-95d2-d83c70a9bf05",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Component \n",
+ " Type \n",
+ " Parent \n",
+ " Domain \n",
+ " vo (V) \n",
+ " vdrop (V) \n",
+ " rs (Ohm) \n",
+ " eff (%) \n",
+ " iq (A) \n",
+ " ii (A) \n",
+ " iis (A) \n",
+ " pwr (W) \n",
+ " pwrs (W) \n",
+ " vi limits (V) \n",
+ " vo limits (V) \n",
+ " ii limits (A) \n",
+ " io limits (A) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " My source \n",
+ " SOURCE \n",
+ " \n",
+ " My source \n",
+ " 3.3 \n",
+ " \n",
+ " 0.007 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1.0] \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Component Type Parent Domain vo (V) vdrop (V) rs (Ohm) eff (%) \\\n",
+ "0 My source SOURCE My source 3.3 0.007 \n",
+ "\n",
+ " iq (A) ii (A) iis (A) pwr (W) pwrs (W) vi limits (V) vo limits (V) \\\n",
+ "0 [0.0, 1000000.0] [0.0, 1000000.0] \n",
+ "\n",
+ " ii limits (A) io limits (A) \n",
+ "0 [0.0, 1000000.0] [0.0, 1.0] "
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "source_params = \"\"\"[source]\n",
+ "vo = 3.3 # output voltage (mandatory)\n",
+ "rs = 0.007 # series resistance (optional)\n",
+ "\n",
+ "[limits] # optional, any combination of below parameters can be specificed\n",
+ "vi = [ 0.0, 1000000.0] \n",
+ "vo = [ 0.0, 1000000.0]\n",
+ "ii = [ 0.0, 1000000.0]\n",
+ "io = [ 0.0, 1.0]\n",
+ "\"\"\"\n",
+ "\n",
+ "with open(\"source.toml\", \"w\") as f:\n",
+ " f.write(source_params)\n",
+ "\n",
+ "sys = System(\"Test toml\", Source.from_file(\"My source\", fname=\"source.toml\"))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "956aadeb-17e8-4099-983b-c460ca6b0fd8",
+ "metadata": {},
+ "source": [
+ "## Converter"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "68ea0008-3f53-4638-9c01-6f1cc9a2df0d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Component \n",
+ " Type \n",
+ " Parent \n",
+ " Domain \n",
+ " vo (V) \n",
+ " vdrop (V) \n",
+ " rs (Ohm) \n",
+ " eff (%) \n",
+ " iq (A) \n",
+ " ii (A) \n",
+ " iis (A) \n",
+ " pwr (W) \n",
+ " pwrs (W) \n",
+ " vi limits (V) \n",
+ " vo limits (V) \n",
+ " ii limits (A) \n",
+ " io limits (A) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " My source \n",
+ " SOURCE \n",
+ " \n",
+ " My source \n",
+ " 3.3 \n",
+ " \n",
+ " 0.007 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1.0] \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " Buck 2.5V \n",
+ " CONVERTER \n",
+ " My source \n",
+ " My source \n",
+ " 2.5 \n",
+ " \n",
+ " \n",
+ " 0.87 \n",
+ " 0.000001 \n",
+ " \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " [2.7, 16.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1.0] \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Component Type Parent Domain vo (V) vdrop (V) rs (Ohm) \\\n",
+ "0 My source SOURCE My source 3.3 0.007 \n",
+ "1 Buck 2.5V CONVERTER My source My source 2.5 \n",
+ "\n",
+ " eff (%) iq (A) ii (A) iis (A) pwr (W) pwrs (W) vi limits (V) \\\n",
+ "0 [0.0, 1000000.0] \n",
+ "1 0.87 0.000001 0.0 [2.7, 16.0] \n",
+ "\n",
+ " vo limits (V) ii limits (A) io limits (A) \n",
+ "0 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1.0] \n",
+ "1 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1.0] "
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "conv_params = \"\"\"[converter]\n",
+ "vo = 2.5 # output voltage (mandatory)\n",
+ "eff = 0.87 # efficiency (mandatory)\n",
+ "# efficiency can optionally be specified as 1D interpolation data\n",
+ "#eff = {\"vi\": [3.3], \"io\": [0.1, 0.5, 0.9], \"eff\": [[0.55, 0.78, 0.92]]}\n",
+ "# or as 2D interpolation data\n",
+ "#eff = {\"vi\": [3.3, 5.0, 12], \"io\": [0.1, 0.5, 0.9], \"eff\": [[0.55, 0.78, 0.92], [0.5, 0.74, 0.83], [0.4, 0.6, 0.766]]}\n",
+ "iq = 1.2e-6 # Quiescent (no-load) current (optional)\n",
+ "iis = 0.33e-6 # Sleep (shut-down) current (optional)\n",
+ "\n",
+ "[limits] # optional, any combination of below parameters can be specificed\n",
+ "vi = [ 2.7, 16.0] \n",
+ "vo = [ 0.0, 1000000.0]\n",
+ "ii = [ 0.0, 1000000.0]\n",
+ "io = [ 0.0, 1.0]\n",
+ "\"\"\"\n",
+ "\n",
+ "with open(\"converter.toml\", \"w\") as f:\n",
+ " f.write(conv_params)\n",
+ "\n",
+ "sys.add_comp(\"My source\", comp=Converter.from_file(\"Buck 2.5V\", fname=\"converter.toml\"))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "51be684b-e43e-436d-ac86-653a9d4f306f",
+ "metadata": {},
+ "source": [
+ "## LinReg"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "d819a10e-e224-43b8-adfd-e0c11da23215",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Component \n",
+ " Type \n",
+ " Parent \n",
+ " Domain \n",
+ " vo (V) \n",
+ " vdrop (V) \n",
+ " rs (Ohm) \n",
+ " eff (%) \n",
+ " iq (A) \n",
+ " ii (A) \n",
+ " iis (A) \n",
+ " pwr (W) \n",
+ " pwrs (W) \n",
+ " vi limits (V) \n",
+ " vo limits (V) \n",
+ " ii limits (A) \n",
+ " io limits (A) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " My source \n",
+ " SOURCE \n",
+ " \n",
+ " My source \n",
+ " 3.3 \n",
+ " \n",
+ " 0.007 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1.0] \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " LDO 1.8V \n",
+ " LINREG \n",
+ " My source \n",
+ " My source \n",
+ " 1.8 \n",
+ " 0.25 \n",
+ " \n",
+ " \n",
+ " 0.000001 \n",
+ " \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " [2.7, 24.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 0.25] \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " Buck 2.5V \n",
+ " CONVERTER \n",
+ " My source \n",
+ " My source \n",
+ " 2.5 \n",
+ " \n",
+ " \n",
+ " 0.87 \n",
+ " 0.000001 \n",
+ " \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " [2.7, 16.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1.0] \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Component Type Parent Domain vo (V) vdrop (V) rs (Ohm) \\\n",
+ "0 My source SOURCE My source 3.3 0.007 \n",
+ "1 LDO 1.8V LINREG My source My source 1.8 0.25 \n",
+ "2 Buck 2.5V CONVERTER My source My source 2.5 \n",
+ "\n",
+ " eff (%) iq (A) ii (A) iis (A) pwr (W) pwrs (W) vi limits (V) \\\n",
+ "0 [0.0, 1000000.0] \n",
+ "1 0.000001 0.0 [2.7, 24.0] \n",
+ "2 0.87 0.000001 0.0 [2.7, 16.0] \n",
+ "\n",
+ " vo limits (V) ii limits (A) io limits (A) \n",
+ "0 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1.0] \n",
+ "1 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 0.25] \n",
+ "2 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1.0] "
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "ldo_params = \"\"\"[linreg]\n",
+ "vo = 1.8 # output voltage (mandatory)\n",
+ "vdrop = 0.25 # dropout voltage (optional)\n",
+ "iq = 1.2e-6 # Quiescent (no-load) current (optional)\n",
+ "iis = 0.33e-6 # Sleep (shut-down) current (optional)\n",
+ "\n",
+ "[limits] # optional, any combination of below parameters can be specificed\n",
+ "vi = [ 2.7, 24.0] \n",
+ "vo = [ 0.0, 1000000.0]\n",
+ "ii = [ 0.0, 1000000.0]\n",
+ "io = [ 0.0, 0.25]\n",
+ "\"\"\"\n",
+ "\n",
+ "with open(\"linreg.toml\", \"w\") as f:\n",
+ " f.write(ldo_params)\n",
+ "\n",
+ "sys.add_comp(\"My source\", comp=LinReg.from_file(\"LDO 1.8V\", fname=\"linreg.toml\"))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9f2e4e25-004b-4a36-af2a-1444cb8d05e6",
+ "metadata": {},
+ "source": [
+ "## RLoss"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "c7fe5b8a-9feb-4200-b769-a9fdbdf8acfe",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Component \n",
+ " Type \n",
+ " Parent \n",
+ " Domain \n",
+ " vo (V) \n",
+ " vdrop (V) \n",
+ " rs (Ohm) \n",
+ " eff (%) \n",
+ " iq (A) \n",
+ " ii (A) \n",
+ " iis (A) \n",
+ " pwr (W) \n",
+ " pwrs (W) \n",
+ " vi limits (V) \n",
+ " vo limits (V) \n",
+ " ii limits (A) \n",
+ " io limits (A) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " My source \n",
+ " SOURCE \n",
+ " \n",
+ " My source \n",
+ " 3.3 \n",
+ " \n",
+ " 0.007 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1.0] \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " LDO 1.8V \n",
+ " LINREG \n",
+ " My source \n",
+ " My source \n",
+ " 1.8 \n",
+ " 0.25 \n",
+ " \n",
+ " \n",
+ " 0.000001 \n",
+ " \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " [2.7, 24.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 0.25] \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " Buck 2.5V \n",
+ " CONVERTER \n",
+ " My source \n",
+ " My source \n",
+ " 2.5 \n",
+ " \n",
+ " \n",
+ " 0.87 \n",
+ " 0.000001 \n",
+ " \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " [2.7, 16.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1.0] \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " Filter \n",
+ " SLOSS \n",
+ " Buck 2.5V \n",
+ " My source \n",
+ " \n",
+ " \n",
+ " 7.5 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Component Type Parent Domain vo (V) vdrop (V) rs (Ohm) \\\n",
+ "0 My source SOURCE My source 3.3 0.007 \n",
+ "1 LDO 1.8V LINREG My source My source 1.8 0.25 \n",
+ "2 Buck 2.5V CONVERTER My source My source 2.5 \n",
+ "3 Filter SLOSS Buck 2.5V My source 7.5 \n",
+ "\n",
+ " eff (%) iq (A) ii (A) iis (A) pwr (W) pwrs (W) vi limits (V) \\\n",
+ "0 [0.0, 1000000.0] \n",
+ "1 0.000001 0.0 [2.7, 24.0] \n",
+ "2 0.87 0.000001 0.0 [2.7, 16.0] \n",
+ "3 [0.0, 1000000.0] \n",
+ "\n",
+ " vo limits (V) ii limits (A) io limits (A) \n",
+ "0 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1.0] \n",
+ "1 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 0.25] \n",
+ "2 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1.0] \n",
+ "3 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1000000.0] "
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "rloss_params = \"\"\"[rloss]\n",
+ "rs = 7.5 # series resistance (mandatory)\n",
+ "\n",
+ "[limits] # optional, any combination of below parameters can be specificed\n",
+ "vi = [ 0.0, 1000000.0] \n",
+ "vo = [ 0.0, 1000000.0]\n",
+ "ii = [ 0.0, 1000000.0]\n",
+ "io = [ 0.0, 1000000.0]\n",
+ "\"\"\"\n",
+ "\n",
+ "with open(\"rloss.toml\", \"w\") as f:\n",
+ " f.write(rloss_params)\n",
+ "\n",
+ "sys.add_comp(\"Buck 2.5V\", comp=RLoss.from_file(\"Filter\", fname=\"rloss.toml\"))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e596f2d8-1697-4587-a3df-8087e905b302",
+ "metadata": {},
+ "source": [
+ "## VLoss"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "35743730-2beb-4f61-8d55-91f0f5861060",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Component \n",
+ " Type \n",
+ " Parent \n",
+ " Domain \n",
+ " vo (V) \n",
+ " vdrop (V) \n",
+ " rs (Ohm) \n",
+ " eff (%) \n",
+ " iq (A) \n",
+ " ii (A) \n",
+ " iis (A) \n",
+ " pwr (W) \n",
+ " pwrs (W) \n",
+ " vi limits (V) \n",
+ " vo limits (V) \n",
+ " ii limits (A) \n",
+ " io limits (A) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " My source \n",
+ " SOURCE \n",
+ " \n",
+ " My source \n",
+ " 3.3 \n",
+ " \n",
+ " 0.007 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1.0] \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " LDO 1.8V \n",
+ " LINREG \n",
+ " My source \n",
+ " My source \n",
+ " 1.8 \n",
+ " 0.25 \n",
+ " \n",
+ " \n",
+ " 0.000001 \n",
+ " \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " [2.7, 24.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 0.25] \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " Buck 2.5V \n",
+ " CONVERTER \n",
+ " My source \n",
+ " My source \n",
+ " 2.5 \n",
+ " \n",
+ " \n",
+ " 0.87 \n",
+ " 0.000001 \n",
+ " \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " [2.7, 16.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1.0] \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " Voltage drop \n",
+ " SLOSS \n",
+ " Buck 2.5V \n",
+ " My source \n",
+ " \n",
+ " 0.33 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " [0.0, 200.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 0.75] \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " Filter \n",
+ " SLOSS \n",
+ " Buck 2.5V \n",
+ " My source \n",
+ " \n",
+ " \n",
+ " 7.5 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Component Type Parent Domain vo (V) vdrop (V) rs (Ohm) \\\n",
+ "0 My source SOURCE My source 3.3 0.007 \n",
+ "1 LDO 1.8V LINREG My source My source 1.8 0.25 \n",
+ "2 Buck 2.5V CONVERTER My source My source 2.5 \n",
+ "3 Voltage drop SLOSS Buck 2.5V My source 0.33 \n",
+ "4 Filter SLOSS Buck 2.5V My source 7.5 \n",
+ "\n",
+ " eff (%) iq (A) ii (A) iis (A) pwr (W) pwrs (W) vi limits (V) \\\n",
+ "0 [0.0, 1000000.0] \n",
+ "1 0.000001 0.0 [2.7, 24.0] \n",
+ "2 0.87 0.000001 0.0 [2.7, 16.0] \n",
+ "3 [0.0, 200.0] \n",
+ "4 [0.0, 1000000.0] \n",
+ "\n",
+ " vo limits (V) ii limits (A) io limits (A) \n",
+ "0 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1.0] \n",
+ "1 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 0.25] \n",
+ "2 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1.0] \n",
+ "3 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 0.75] \n",
+ "4 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1000000.0] "
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "vloss_params = \"\"\"[vloss]\n",
+ "vdrop = 0.33 # voltage drop (mandatory)\n",
+ "# voltage drop can optionally be specified as 1D interpolation data\n",
+ "#vdrop = {\"vi\": [3.3], \"io\": [0.1, 0.5, 0.9], \"vdrop\": [[0.23, 0.34, 0.477]]}\n",
+ "# or as 2D interpolation data\n",
+ "#vdrop = {\"vi\": [3.3, 5.0, 12], \"io\": [0.1, 0.5, 0.9], \"vdrop\": [[0.23, 0.34, 0.477], [0.27, 0.39, 0.51], [0.3, 0.41, 0.57]]}\n",
+ "\n",
+ "[limits] # optional, any combination of below parameters can be specificed\n",
+ "vi = [ 0.0, 200.0] \n",
+ "vo = [ 0.0, 1000000.0]\n",
+ "ii = [ 0.0, 1000000.0]\n",
+ "io = [ 0.0, 0.75]\n",
+ "\"\"\"\n",
+ "\n",
+ "with open(\"vloss.toml\", \"w\") as f:\n",
+ " f.write(vloss_params)\n",
+ "\n",
+ "sys.add_comp(\"Buck 2.5V\", comp=VLoss.from_file(\"Voltage drop\", fname=\"vloss.toml\"))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "66a6c661-ee20-4edc-b2a2-46c040414ba3",
+ "metadata": {},
+ "source": [
+ "## PLoad"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "437cfd1c-ea62-4b13-aae8-a71085d5c464",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Component \n",
+ " Type \n",
+ " Parent \n",
+ " Domain \n",
+ " vo (V) \n",
+ " vdrop (V) \n",
+ " rs (Ohm) \n",
+ " eff (%) \n",
+ " iq (A) \n",
+ " ii (A) \n",
+ " iis (A) \n",
+ " pwr (W) \n",
+ " pwrs (W) \n",
+ " vi limits (V) \n",
+ " vo limits (V) \n",
+ " ii limits (A) \n",
+ " io limits (A) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " My source \n",
+ " SOURCE \n",
+ " \n",
+ " My source \n",
+ " 3.3 \n",
+ " \n",
+ " 0.007 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1.0] \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " LDO 1.8V \n",
+ " LINREG \n",
+ " My source \n",
+ " My source \n",
+ " 1.8 \n",
+ " 0.25 \n",
+ " \n",
+ " \n",
+ " 0.000001 \n",
+ " \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " [2.7, 24.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 0.25] \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " MCU \n",
+ " LOAD \n",
+ " LDO 1.8V \n",
+ " My source \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0.5 \n",
+ " 0.001 \n",
+ " [0.0, 24.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " Buck 2.5V \n",
+ " CONVERTER \n",
+ " My source \n",
+ " My source \n",
+ " 2.5 \n",
+ " \n",
+ " \n",
+ " 0.87 \n",
+ " 0.000001 \n",
+ " \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " [2.7, 16.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1.0] \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " Voltage drop \n",
+ " SLOSS \n",
+ " Buck 2.5V \n",
+ " My source \n",
+ " \n",
+ " 0.33 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " [0.0, 200.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 0.75] \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " Filter \n",
+ " SLOSS \n",
+ " Buck 2.5V \n",
+ " My source \n",
+ " \n",
+ " \n",
+ " 7.5 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Component Type Parent Domain vo (V) vdrop (V) rs (Ohm) \\\n",
+ "0 My source SOURCE My source 3.3 0.007 \n",
+ "1 LDO 1.8V LINREG My source My source 1.8 0.25 \n",
+ "2 MCU LOAD LDO 1.8V My source \n",
+ "3 Buck 2.5V CONVERTER My source My source 2.5 \n",
+ "4 Voltage drop SLOSS Buck 2.5V My source 0.33 \n",
+ "5 Filter SLOSS Buck 2.5V My source 7.5 \n",
+ "\n",
+ " eff (%) iq (A) ii (A) iis (A) pwr (W) pwrs (W) vi limits (V) \\\n",
+ "0 [0.0, 1000000.0] \n",
+ "1 0.000001 0.0 [2.7, 24.0] \n",
+ "2 0.5 0.001 [0.0, 24.0] \n",
+ "3 0.87 0.000001 0.0 [2.7, 16.0] \n",
+ "4 [0.0, 200.0] \n",
+ "5 [0.0, 1000000.0] \n",
+ "\n",
+ " vo limits (V) ii limits (A) io limits (A) \n",
+ "0 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1.0] \n",
+ "1 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 0.25] \n",
+ "2 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1000000.0] \n",
+ "3 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1.0] \n",
+ "4 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 0.75] \n",
+ "5 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1000000.0] "
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "pload_params = \"\"\"[pload]\n",
+ "pwr = 0.5 # load power (W) (mandatory)\n",
+ "pwrs = 1e-3 # sleep mode load power (optional)\n",
+ "\n",
+ "[limits] # optional, any combination of below parameters can be specificed\n",
+ "vi = [ 0.0, 24.0] \n",
+ "vo = [ 0.0, 1000000.0]\n",
+ "ii = [ 0.0, 1000000.0]\n",
+ "io = [ 0.0, 1000000.0]\n",
+ "\"\"\"\n",
+ "\n",
+ "with open(\"pload.toml\", \"w\") as f:\n",
+ " f.write(pload_params)\n",
+ "\n",
+ "sys.add_comp(\"LDO 1.8V\", comp=PLoad.from_file(\"MCU\", fname=\"pload.toml\"))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "431bcf8b-1007-4340-bb97-6edcbf18315e",
+ "metadata": {},
+ "source": [
+ "## ILoad"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "0b1464be-18d2-44ba-ae98-08e368c33b34",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Component \n",
+ " Type \n",
+ " Parent \n",
+ " Domain \n",
+ " vo (V) \n",
+ " vdrop (V) \n",
+ " rs (Ohm) \n",
+ " eff (%) \n",
+ " iq (A) \n",
+ " ii (A) \n",
+ " iis (A) \n",
+ " pwr (W) \n",
+ " pwrs (W) \n",
+ " vi limits (V) \n",
+ " vo limits (V) \n",
+ " ii limits (A) \n",
+ " io limits (A) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " My source \n",
+ " SOURCE \n",
+ " \n",
+ " My source \n",
+ " 3.3 \n",
+ " \n",
+ " 0.007 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1.0] \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " LDO 1.8V \n",
+ " LINREG \n",
+ " My source \n",
+ " My source \n",
+ " 1.8 \n",
+ " 0.25 \n",
+ " \n",
+ " \n",
+ " 0.000001 \n",
+ " \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " [2.7, 24.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 0.25] \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " MCU \n",
+ " LOAD \n",
+ " LDO 1.8V \n",
+ " My source \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0.5 \n",
+ " 0.001 \n",
+ " [0.0, 24.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " Buck 2.5V \n",
+ " CONVERTER \n",
+ " My source \n",
+ " My source \n",
+ " 2.5 \n",
+ " \n",
+ " \n",
+ " 0.87 \n",
+ " 0.000001 \n",
+ " \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " [2.7, 16.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1.0] \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " Voltage drop \n",
+ " SLOSS \n",
+ " Buck 2.5V \n",
+ " My source \n",
+ " \n",
+ " 0.33 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " [0.0, 200.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 0.75] \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " Filter \n",
+ " SLOSS \n",
+ " Buck 2.5V \n",
+ " My source \n",
+ " \n",
+ " \n",
+ " 7.5 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " Load \n",
+ " LOAD \n",
+ " Filter \n",
+ " My source \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0.125 \n",
+ " 0.00001 \n",
+ " \n",
+ " \n",
+ " [0.0, 24.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Component Type Parent Domain vo (V) vdrop (V) rs (Ohm) \\\n",
+ "0 My source SOURCE My source 3.3 0.007 \n",
+ "1 LDO 1.8V LINREG My source My source 1.8 0.25 \n",
+ "2 MCU LOAD LDO 1.8V My source \n",
+ "3 Buck 2.5V CONVERTER My source My source 2.5 \n",
+ "4 Voltage drop SLOSS Buck 2.5V My source 0.33 \n",
+ "5 Filter SLOSS Buck 2.5V My source 7.5 \n",
+ "6 Load LOAD Filter My source \n",
+ "\n",
+ " eff (%) iq (A) ii (A) iis (A) pwr (W) pwrs (W) vi limits (V) \\\n",
+ "0 [0.0, 1000000.0] \n",
+ "1 0.000001 0.0 [2.7, 24.0] \n",
+ "2 0.5 0.001 [0.0, 24.0] \n",
+ "3 0.87 0.000001 0.0 [2.7, 16.0] \n",
+ "4 [0.0, 200.0] \n",
+ "5 [0.0, 1000000.0] \n",
+ "6 0.125 0.00001 [0.0, 24.0] \n",
+ "\n",
+ " vo limits (V) ii limits (A) io limits (A) \n",
+ "0 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1.0] \n",
+ "1 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 0.25] \n",
+ "2 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1000000.0] \n",
+ "3 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1.0] \n",
+ "4 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 0.75] \n",
+ "5 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1000000.0] \n",
+ "6 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1000000.0] "
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "iload_params = \"\"\"[iload]\n",
+ "ii = 0.125 # load current (A) (mandatory)\n",
+ "iis = 1e-5 # sleep mode load current (optional)\n",
+ "\n",
+ "[limits] # optional, any combination of below parameters can be specificed\n",
+ "vi = [ 0.0, 24.0] \n",
+ "vo = [ 0.0, 1000000.0]\n",
+ "ii = [ 0.0, 1000000.0]\n",
+ "io = [ 0.0, 1000000.0]\n",
+ "\"\"\"\n",
+ "\n",
+ "with open(\"iload.toml\", \"w\") as f:\n",
+ " f.write(iload_params)\n",
+ "\n",
+ "sys.add_comp(\"Filter\", comp=ILoad.from_file(\"Load\", fname=\"iload.toml\"))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "80e89778-0347-437e-b75e-5048334df5af",
+ "metadata": {},
+ "source": [
+ "## RLoad"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "f2eb9fd3-4a3c-4b00-ab1c-ceffd8d9524f",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Component \n",
+ " Type \n",
+ " Parent \n",
+ " Domain \n",
+ " vo (V) \n",
+ " vdrop (V) \n",
+ " rs (Ohm) \n",
+ " eff (%) \n",
+ " iq (A) \n",
+ " ii (A) \n",
+ " iis (A) \n",
+ " pwr (W) \n",
+ " pwrs (W) \n",
+ " vi limits (V) \n",
+ " vo limits (V) \n",
+ " ii limits (A) \n",
+ " io limits (A) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " My source \n",
+ " SOURCE \n",
+ " \n",
+ " My source \n",
+ " 3.3 \n",
+ " \n",
+ " 0.007 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1.0] \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " LDO 1.8V \n",
+ " LINREG \n",
+ " My source \n",
+ " My source \n",
+ " 1.8 \n",
+ " 0.25 \n",
+ " \n",
+ " \n",
+ " 0.000001 \n",
+ " \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " [2.7, 24.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 0.25] \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " MCU \n",
+ " LOAD \n",
+ " LDO 1.8V \n",
+ " My source \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0.5 \n",
+ " 0.001 \n",
+ " [0.0, 24.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " Buck 2.5V \n",
+ " CONVERTER \n",
+ " My source \n",
+ " My source \n",
+ " 2.5 \n",
+ " \n",
+ " \n",
+ " 0.87 \n",
+ " 0.000001 \n",
+ " \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " [2.7, 16.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1.0] \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " Voltage drop \n",
+ " SLOSS \n",
+ " Buck 2.5V \n",
+ " My source \n",
+ " \n",
+ " 0.33 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " [0.0, 200.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 0.75] \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " Resistor \n",
+ " LOAD \n",
+ " Voltage drop \n",
+ " My source \n",
+ " \n",
+ " \n",
+ " 12.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " Filter \n",
+ " SLOSS \n",
+ " Buck 2.5V \n",
+ " My source \n",
+ " \n",
+ " \n",
+ " 7.5 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " Load \n",
+ " LOAD \n",
+ " Filter \n",
+ " My source \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0.125 \n",
+ " 0.00001 \n",
+ " \n",
+ " \n",
+ " [0.0, 24.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Component Type Parent Domain vo (V) vdrop (V) rs (Ohm) \\\n",
+ "0 My source SOURCE My source 3.3 0.007 \n",
+ "1 LDO 1.8V LINREG My source My source 1.8 0.25 \n",
+ "2 MCU LOAD LDO 1.8V My source \n",
+ "3 Buck 2.5V CONVERTER My source My source 2.5 \n",
+ "4 Voltage drop SLOSS Buck 2.5V My source 0.33 \n",
+ "5 Resistor LOAD Voltage drop My source 12.0 \n",
+ "6 Filter SLOSS Buck 2.5V My source 7.5 \n",
+ "7 Load LOAD Filter My source \n",
+ "\n",
+ " eff (%) iq (A) ii (A) iis (A) pwr (W) pwrs (W) vi limits (V) \\\n",
+ "0 [0.0, 1000000.0] \n",
+ "1 0.000001 0.0 [2.7, 24.0] \n",
+ "2 0.5 0.001 [0.0, 24.0] \n",
+ "3 0.87 0.000001 0.0 [2.7, 16.0] \n",
+ "4 [0.0, 200.0] \n",
+ "5 [0.0, 1000000.0] \n",
+ "6 [0.0, 1000000.0] \n",
+ "7 0.125 0.00001 [0.0, 24.0] \n",
+ "\n",
+ " vo limits (V) ii limits (A) io limits (A) \n",
+ "0 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1.0] \n",
+ "1 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 0.25] \n",
+ "2 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1000000.0] \n",
+ "3 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1.0] \n",
+ "4 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 0.75] \n",
+ "5 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1000000.0] \n",
+ "6 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1000000.0] \n",
+ "7 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1000000.0] "
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "rload_params = \"\"\"[rload]\n",
+ "rs = 12.0 # series resistance (mandatory)\n",
+ "\n",
+ "[limits] # optional, any combination of below parameters can be specificed\n",
+ "vi = [ 0.0, 1000000.0] \n",
+ "vo = [ 0.0, 1000000.0]\n",
+ "ii = [ 0.0, 1000000.0]\n",
+ "io = [ 0.0, 1000000.0]\n",
+ "\"\"\"\n",
+ "\n",
+ "with open(\"rload.toml\", \"w\") as f:\n",
+ " f.write(rload_params)\n",
+ "\n",
+ "sys.add_comp(\"Voltage drop\", comp=RLoad.from_file(\"Resistor\", fname=\"rload.toml\"))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "22a41bdc-9b80-4d5c-b403-e9488d68b93a",
+ "metadata": {},
+ "source": [
+ "## Summary\n",
+ "All component parameters can be loaded from .toml files."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "d67b1920-0f7a-46a8-8492-9437df9ebc54",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Component \n",
+ " Type \n",
+ " Parent \n",
+ " Domain \n",
+ " vo (V) \n",
+ " vdrop (V) \n",
+ " rs (Ohm) \n",
+ " eff (%) \n",
+ " iq (A) \n",
+ " ii (A) \n",
+ " iis (A) \n",
+ " pwr (W) \n",
+ " pwrs (W) \n",
+ " vi limits (V) \n",
+ " vo limits (V) \n",
+ " ii limits (A) \n",
+ " io limits (A) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " My source \n",
+ " SOURCE \n",
+ " \n",
+ " My source \n",
+ " 3.3 \n",
+ " \n",
+ " 0.007 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1.0] \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " LDO 1.8V \n",
+ " LINREG \n",
+ " My source \n",
+ " My source \n",
+ " 1.8 \n",
+ " 0.25 \n",
+ " \n",
+ " \n",
+ " 0.000001 \n",
+ " \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " [2.7, 24.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 0.25] \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " MCU \n",
+ " LOAD \n",
+ " LDO 1.8V \n",
+ " My source \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0.5 \n",
+ " 0.001 \n",
+ " [0.0, 24.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " Buck 2.5V \n",
+ " CONVERTER \n",
+ " My source \n",
+ " My source \n",
+ " 2.5 \n",
+ " \n",
+ " \n",
+ " 0.87 \n",
+ " 0.000001 \n",
+ " \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " [2.7, 16.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1.0] \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " Voltage drop \n",
+ " SLOSS \n",
+ " Buck 2.5V \n",
+ " My source \n",
+ " \n",
+ " 0.33 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " [0.0, 200.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 0.75] \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " Resistor \n",
+ " LOAD \n",
+ " Voltage drop \n",
+ " My source \n",
+ " \n",
+ " \n",
+ " 12.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " Filter \n",
+ " SLOSS \n",
+ " Buck 2.5V \n",
+ " My source \n",
+ " \n",
+ " \n",
+ " 7.5 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " Load \n",
+ " LOAD \n",
+ " Filter \n",
+ " My source \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0.125 \n",
+ " 0.00001 \n",
+ " \n",
+ " \n",
+ " [0.0, 24.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " [0.0, 1000000.0] \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Component Type Parent Domain vo (V) vdrop (V) rs (Ohm) \\\n",
+ "0 My source SOURCE My source 3.3 0.007 \n",
+ "1 LDO 1.8V LINREG My source My source 1.8 0.25 \n",
+ "2 MCU LOAD LDO 1.8V My source \n",
+ "3 Buck 2.5V CONVERTER My source My source 2.5 \n",
+ "4 Voltage drop SLOSS Buck 2.5V My source 0.33 \n",
+ "5 Resistor LOAD Voltage drop My source 12.0 \n",
+ "6 Filter SLOSS Buck 2.5V My source 7.5 \n",
+ "7 Load LOAD Filter My source \n",
+ "\n",
+ " eff (%) iq (A) ii (A) iis (A) pwr (W) pwrs (W) vi limits (V) \\\n",
+ "0 [0.0, 1000000.0] \n",
+ "1 0.000001 0.0 [2.7, 24.0] \n",
+ "2 0.5 0.001 [0.0, 24.0] \n",
+ "3 0.87 0.000001 0.0 [2.7, 16.0] \n",
+ "4 [0.0, 200.0] \n",
+ "5 [0.0, 1000000.0] \n",
+ "6 [0.0, 1000000.0] \n",
+ "7 0.125 0.00001 [0.0, 24.0] \n",
+ "\n",
+ " vo limits (V) ii limits (A) io limits (A) \n",
+ "0 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1.0] \n",
+ "1 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 0.25] \n",
+ "2 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1000000.0] \n",
+ "3 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1.0] \n",
+ "4 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 0.75] \n",
+ "5 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1000000.0] \n",
+ "6 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1000000.0] \n",
+ "7 [0.0, 1000000.0] [0.0, 1000000.0] [0.0, 1000000.0] "
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "sys.params(limits=True)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "dbc87a3b-ab82-4c95-a536-51309b62590d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "Test source\n",
+ "└── My source\n",
+ " ├── LDO 1.8V\n",
+ " │ └── MCU\n",
+ " └── Buck 2.5V\n",
+ " ├── Voltage drop\n",
+ " │ └── Resistor\n",
+ " └── Filter\n",
+ " └── Load\n",
+ " \n"
+ ],
+ "text/plain": [
+ "Test source\n",
+ "└── My source\n",
+ " ├── LDO 1.8V\n",
+ " │ └── MCU\n",
+ " └── Buck 2.5V\n",
+ " ├── Voltage drop\n",
+ " │ └── Resistor\n",
+ " └── Filter\n",
+ " └── Load\n"
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "sys.tree()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "id": "233467a3-1a5c-4d7f-8619-fb6683547e07",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Component \n",
+ " Type \n",
+ " Parent \n",
+ " Domain \n",
+ " Vin (V) \n",
+ " Vout (V) \n",
+ " Iin (A) \n",
+ " Iout (A) \n",
+ " Power (W) \n",
+ " Loss (W) \n",
+ " Efficiency (%) \n",
+ " Warnings \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " My source \n",
+ " SOURCE \n",
+ " \n",
+ " My source \n",
+ " 3.3 \n",
+ " 3.296189 \n",
+ " 0.544398 \n",
+ " 0.544398 \n",
+ " 1.796514 \n",
+ " 0.002075 \n",
+ " 99.884522 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " LDO 1.8V \n",
+ " LINREG \n",
+ " My source \n",
+ " My source \n",
+ " 3.296189 \n",
+ " 1.8 \n",
+ " 0.277778 \n",
+ " 0.277778 \n",
+ " 0.915608 \n",
+ " 0.415608 \n",
+ " 54.608516 \n",
+ " io \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " MCU \n",
+ " LOAD \n",
+ " LDO 1.8V \n",
+ " My source \n",
+ " 1.8 \n",
+ " 0.0 \n",
+ " 0.277778 \n",
+ " 0.0 \n",
+ " 0.5 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " Buck 2.5V \n",
+ " CONVERTER \n",
+ " My source \n",
+ " My source \n",
+ " 3.296189 \n",
+ " 2.5 \n",
+ " 0.26662 \n",
+ " 0.305833 \n",
+ " 0.878831 \n",
+ " 0.114248 \n",
+ " 87.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " Voltage drop \n",
+ " SLOSS \n",
+ " Buck 2.5V \n",
+ " My source \n",
+ " 2.5 \n",
+ " 2.17 \n",
+ " 0.180833 \n",
+ " 0.180833 \n",
+ " 0.452083 \n",
+ " 0.059675 \n",
+ " 86.8 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " Resistor \n",
+ " LOAD \n",
+ " Voltage drop \n",
+ " My source \n",
+ " 2.17 \n",
+ " 0.0 \n",
+ " 0.180833 \n",
+ " 0.0 \n",
+ " 0.392408 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " Filter \n",
+ " SLOSS \n",
+ " Buck 2.5V \n",
+ " My source \n",
+ " 2.5 \n",
+ " 1.5625 \n",
+ " 0.125 \n",
+ " 0.125 \n",
+ " 0.3125 \n",
+ " 0.117188 \n",
+ " 62.5 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " Load \n",
+ " LOAD \n",
+ " Filter \n",
+ " My source \n",
+ " 1.5625 \n",
+ " 0.0 \n",
+ " 0.125 \n",
+ " 0.0 \n",
+ " 0.195312 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " System total \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 1.796514 \n",
+ " 0.708793 \n",
+ " 60.546185 \n",
+ " Yes \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Component Type Parent Domain Vin (V) Vout (V) \\\n",
+ "0 My source SOURCE My source 3.3 3.296189 \n",
+ "1 LDO 1.8V LINREG My source My source 3.296189 1.8 \n",
+ "2 MCU LOAD LDO 1.8V My source 1.8 0.0 \n",
+ "3 Buck 2.5V CONVERTER My source My source 3.296189 2.5 \n",
+ "4 Voltage drop SLOSS Buck 2.5V My source 2.5 2.17 \n",
+ "5 Resistor LOAD Voltage drop My source 2.17 0.0 \n",
+ "6 Filter SLOSS Buck 2.5V My source 2.5 1.5625 \n",
+ "7 Load LOAD Filter My source 1.5625 0.0 \n",
+ "8 System total \n",
+ "\n",
+ " Iin (A) Iout (A) Power (W) Loss (W) Efficiency (%) Warnings \n",
+ "0 0.544398 0.544398 1.796514 0.002075 99.884522 \n",
+ "1 0.277778 0.277778 0.915608 0.415608 54.608516 io \n",
+ "2 0.277778 0.0 0.5 0.0 100.0 \n",
+ "3 0.26662 0.305833 0.878831 0.114248 87.0 \n",
+ "4 0.180833 0.180833 0.452083 0.059675 86.8 \n",
+ "5 0.180833 0.0 0.392408 0.0 100.0 \n",
+ "6 0.125 0.125 0.3125 0.117188 62.5 \n",
+ "7 0.125 0.0 0.195312 0.0 100.0 \n",
+ "8 1.796514 0.708793 60.546185 Yes "
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "sys.solve()"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "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.11.8"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/nb/Datacenter rack.ipynb b/docs/nb/Datacenter rack.ipynb
new file mode 100644
index 0000000..35184cd
--- /dev/null
+++ b/docs/nb/Datacenter rack.ipynb
@@ -0,0 +1,430 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "a1ca17a0-128e-46b7-b65d-011116b44d28",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "# Datacenter Compute Rack\n",
+ "In this tutorial we will calculate the yearly energy consumption of a 19in server rack. \n",
+ "\n",
+ "Configurations:\n",
+ " * 16 2U servers with 230VAC input\n",
+ " * Server power (maximum): 850W\n",
+ " * PDU distribution resistance: 2.5mOhm\n",
+ " * Three different versions of 80plus certified PSUs: Bronze, Gold and Titanium\n",
+ "\n",
+ "The rack is operated as follows during a year:\n",
+ " * 1 day shutdown for maintenance\n",
+ " * 75% of active time operating at 100% power\n",
+ " * 20% of active time operating at 50% power\n",
+ " * 5% of active time operating at 5% of power"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "0ddf2bf4-d388-4195-aaaa-c0a4969b02b0",
+ "metadata": {
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": [
+ "remove-cell"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "# This cell can be removed, it is only used for running the notebook during Sphinx documentation build.\n",
+ "import sys, os\n",
+ "if os.getcwd().replace('\\\\', '/').endswith(\"/docs/nb\"):\n",
+ " sys.path.insert(0, os.path.abspath(os.path.join(\"../../src\")))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "3555e267-3e0a-4c54-8611-f498f616146e",
+ "metadata": {
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "from sysloss.components import *\n",
+ "from sysloss.system import System\n",
+ "import pandas as pd"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3e9ec23a-db71-4f10-acac-81928ed90913",
+ "metadata": {
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "## System definition\n",
+ "The function *create_rack()* below is used to create a system with the PSU efficiency parameter as input.\n",
+ "\n",
+ "The following load phases are defined as well:\n",
+ " * \"Service\"\n",
+ " * \"Full load\"\n",
+ " * \"Half load\"\n",
+ " * \"Idle\"\n",
+ "\n",
+ "```{note}\n",
+ "sysLoss treats AC and DC voltages the same. This is valid when the rms AC voltage is used on single phase (power factor 1).\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "47140e30-4db4-4d4d-93ea-3e72769df775",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "DAY_SECS = 24*60*60 # seconds in a day\n",
+ "rack_phases = {\"Service\": DAY_SECS, \"Full load\": 364*DAY_SECS*0.75, \"Half load\": 364*DAY_SECS*0.75, \"Idle\": 364*DAY_SECS*0.05}\n",
+ "\n",
+ "def create_rack(psu_efficiency):\n",
+ " sys = System(\"Compute rack\", source=Source(\"230VAC\", vo=230.0))\n",
+ " sys.set_sys_phases(rack_phases)\n",
+ " for i in range(16):\n",
+ " idx = \"[{}]\".format(i+1)\n",
+ " sys.add_comp(\"230VAC\", comp=RLoss(\"PDU resistance\"+idx, rs=2.5e-3))\n",
+ " sys.add_comp(\"PDU resistance\"+idx, comp=Converter(\"PSU\"+idx, vo=12.0, eff=psu_efficiency))\n",
+ " sys.set_comp_phases(\"PSU\"+idx, [\"Full load\", \"Half load\", \"Idle\"])\n",
+ " sys.add_comp(\"PSU\"+idx, comp=PLoad(\"Blade\"+idx, pwr=850.0))\n",
+ " sys.set_comp_phases(\"Blade\"+idx, {\"Full load\": 850.0, \"Half load\": 425.0, \"Idle\": 42.5})\n",
+ " return sys"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a6eb2a0c-07ee-43b0-8569-4d94976635a4",
+ "metadata": {},
+ "source": [
+ "Define efficiency for the three different PSU ratings:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "8937c0ea-f451-408a-ae43-074bb6c113ad",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "bronze_eff = {\"vi\": [230.0], \"io\":[3.55, 7.1, 14.2, 35.5, 71.0], \"eff\":[[.67, .79, .85, .88, .85]]}\n",
+ "gold_eff = {\"vi\": [230.0], \"io\":[3.55, 7.1, 14.2, 35.5, 71.0], \"eff\":[[.79, .86, .90, .92, .89]]}\n",
+ "titanium_eff = {\"vi\": [230.0], \"io\":[3.55, 7.1, 14.2, 35.5, 71.0], \"eff\":[[.84, .90, .94, .96, .91]]}"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "326d0203-ed99-4f25-acfc-acdb9f499213",
+ "metadata": {},
+ "source": [
+ "## Analysis\n",
+ "Analysis is straight forward - run *solve()* with each of the three PSU ratings.\n",
+ "\n",
+ "```{tip}\n",
+ "Set the *energy* parameter in *.solve()* to True - the results table will then contain a new column with the 24h energy consumption.\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "9b2ba15e-8f1d-47d2-8a75-aee3f9597128",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Component \n",
+ " Type \n",
+ " Parent \n",
+ " Rating \n",
+ " Phase \n",
+ " Vin (V) \n",
+ " Vout (V) \n",
+ " Iin (A) \n",
+ " Iout (A) \n",
+ " Power (W) \n",
+ " Loss (W) \n",
+ " Efficiency (%) \n",
+ " 24h energy (Wh) \n",
+ " Warnings \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 598 \n",
+ " PDU resistance[1] \n",
+ " SLOSS \n",
+ " 230VAC \n",
+ " Titanium \n",
+ " Idle \n",
+ " 230.0 \n",
+ " 229.99945 \n",
+ " 0.21998 \n",
+ " 0.21998 \n",
+ " 50.595359 \n",
+ " 0.000121 \n",
+ " 99.999761 \n",
+ " 39.101297 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 599 \n",
+ " PSU[1] \n",
+ " CONVERTER \n",
+ " PDU resistance[1] \n",
+ " Titanium \n",
+ " Idle \n",
+ " 229.99945 \n",
+ " 12.0 \n",
+ " 0.21998 \n",
+ " 3.541667 \n",
+ " 50.595238 \n",
+ " 8.095238 \n",
+ " 84.0 \n",
+ " 39.101203 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 600 \n",
+ " Blade[1] \n",
+ " LOAD \n",
+ " PSU[1] \n",
+ " Titanium \n",
+ " Idle \n",
+ " 12.0 \n",
+ " 0.0 \n",
+ " 3.541667 \n",
+ " 0.0 \n",
+ " 42.5 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " 32.845011 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 601 \n",
+ " System total \n",
+ " \n",
+ " \n",
+ " Titanium \n",
+ " Idle \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 809.525745 \n",
+ " 129.525745 \n",
+ " 83.999799 \n",
+ " 625.620746 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 602 \n",
+ " System average \n",
+ " \n",
+ " \n",
+ " Titanium \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 10664.913806 \n",
+ " 789.513963 \n",
+ " 93.210233 \n",
+ " 255957.931346 \n",
+ " \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Component Type Parent Rating Phase \\\n",
+ "598 PDU resistance[1] SLOSS 230VAC Titanium Idle \n",
+ "599 PSU[1] CONVERTER PDU resistance[1] Titanium Idle \n",
+ "600 Blade[1] LOAD PSU[1] Titanium Idle \n",
+ "601 System total Titanium Idle \n",
+ "602 System average Titanium \n",
+ "\n",
+ " Vin (V) Vout (V) Iin (A) Iout (A) Power (W) Loss (W) \\\n",
+ "598 230.0 229.99945 0.21998 0.21998 50.595359 0.000121 \n",
+ "599 229.99945 12.0 0.21998 3.541667 50.595238 8.095238 \n",
+ "600 12.0 0.0 3.541667 0.0 42.5 0.0 \n",
+ "601 809.525745 129.525745 \n",
+ "602 10664.913806 789.513963 \n",
+ "\n",
+ " Efficiency (%) 24h energy (Wh) Warnings \n",
+ "598 99.999761 39.101297 \n",
+ "599 84.0 39.101203 \n",
+ "600 100.0 32.845011 \n",
+ "601 83.999799 625.620746 \n",
+ "602 93.210233 255957.931346 "
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "raitings = {\"Bronze\": bronze_eff, \"Gold\": gold_eff, \"Titanium\": titanium_eff}\n",
+ "\n",
+ "res = []\n",
+ "for r in raitings.keys():\n",
+ " rack = create_rack(raitings[r])\n",
+ " res += [rack.solve(tags={\"Rating\": r}, energy=True)]\n",
+ "df = pd.concat(res, ignore_index=True)\n",
+ "df.tail()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e07b2ecb-97ad-4620-9419-7fb94ba9ceec",
+ "metadata": {},
+ "source": [
+ "Since we are interested in the yearly power consumption, a new column is created for this:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "4e53290e-d990-4af0-b463-4ac357e083d0",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ " \n",
+ " \n",
+ " Component \n",
+ " Rating \n",
+ " Power (W) \n",
+ " Loss (W) \n",
+ " Efficiency (%) \n",
+ " Annual power (kWh) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " System average \n",
+ " Bronze \n",
+ " 11492.974920 \n",
+ " 1617.575080 \n",
+ " 85.894183 \n",
+ " 100678.460297 \n",
+ " \n",
+ " \n",
+ " System average \n",
+ " Gold \n",
+ " 10978.275298 \n",
+ " 1102.875456 \n",
+ " 90.146603 \n",
+ " 96169.691606 \n",
+ " \n",
+ " \n",
+ " System average \n",
+ " Titanium \n",
+ " 10664.913806 \n",
+ " 789.513963 \n",
+ " 93.210233 \n",
+ " 93424.644941 \n",
+ " \n",
+ " \n",
+ "
\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df[\"Annual power (kWh)\"] = df[\"24h energy (Wh)\"] * 365 / 1000\n",
+ "df[df.Component == \"System average\"][[\"Component\", \"Rating\", \"Power (W)\", \"Loss (W)\", \"Efficiency (%)\", \"Annual power (kWh)\"]].style.hide(axis='index')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "606a90fd-ad74-4228-8502-37cba6010b75",
+ "metadata": {},
+ "source": [
+ "The power savings from using a Titanium certified PSU over a Gold certified PSU is 7263kWh per year. Is there an economic gain to use higher rated PSUs? That depends on the lifetime of the rack, the energy prices and the cost difference between e.g. a Bronze PSU and Titanium PSU."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "99692134-a950-46fd-bb29-60f7e6f5cf8a",
+ "metadata": {},
+ "source": [
+ "## Summary\n",
+ "This tutorial demonstrates how system energy consumption can be analyzed with sysLoss by enabling the *energy* parameter in *solve()*."
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "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.11.8"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/nb/PCIe FPGA.ipynb b/docs/nb/PCIe FPGA.ipynb
new file mode 100644
index 0000000..f20689e
--- /dev/null
+++ b/docs/nb/PCIe FPGA.ipynb
@@ -0,0 +1,1475 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "a1ca17a0-128e-46b7-b65d-011116b44d28",
+ "metadata": {
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "# PCIe FPGA Data Aquisition Board\n",
+ "The topic in this notebook is the analysis of a high-speed data acquisition PCIe board based around a large FPGA (Field Programmable Gate Array). A number of high-speed ADCs, each with its own power delivery system, is connected to the FPGA with JESD204B links. Data is pre-processed in the FPGA before being sent across the PCIe bus. The board can only draw power from the PCIe connector (no extra ATX connectors), and the task at hand is to determine how many ADC channels can be added to the board within the power limits of the PCIe specification (75W).\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "0ddf2bf4-d388-4195-aaaa-c0a4969b02b0",
+ "metadata": {
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": [
+ "remove-cell"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "# This cell can be removed, it is only used for running the notebook during Sphinx documentation build.\n",
+ "import sys, os\n",
+ "if os.getcwd().replace('\\\\', '/').endswith(\"/docs/nb\"):\n",
+ " sys.path.insert(0, os.path.abspath(os.path.join(\"../../src\")))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "3555e267-3e0a-4c54-8611-f498f616146e",
+ "metadata": {
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "from sysloss.components import *\n",
+ "from sysloss.system import System\n",
+ "import pandas as pd"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3e9ec23a-db71-4f10-acac-81928ed90913",
+ "metadata": {
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "## System definition\n",
+ "Each ADC channel will use the following resources:\n",
+ " * Two JESD204B lanes to the FPGA\n",
+ " * About 7% of FPGA logic for pre-processing\n",
+ " * Four power rails: 1.8V and 3x 1.2V (converted from 12V):\n",
+ "\n",
+ "![ADC power](PCIeADC.png)\n",
+ "\n",
+ "The FPGA has 32 transceivers, 8 are used for PCIe while the rest are dedicated to JESD204 lanes. This sets the upper limit for the number of ADC channels to 12. The FPGA itself has 4 power rails: 1.8V (AUX), 1.2V (AVTT), 0.9V (AVCC) and 0.85V (VCCINT). Except for the high-speed transceivers, there are practically no I/O used, so I/O bank power is left out of the analysis.\n",
+ "\n",
+ "Power consumption of the ADC is collected from the data sheet, and FPGA power is estimated using the FPGA power tools. FPGA power consumption is summarized in the table below:\n",
+ "\n",
+ "| Voltage | ADC (per channel) Power (W) | System control & PCIe Power (W)| Static FPGA power (W) |\n",
+ "|--------:|------:|-----:|------:|\n",
+ "| VCCINT | 1.58|1.254| 1.67|\n",
+ "| AVCC | 0.051| 0.45| 0.57|\n",
+ "| AVTT | 0.22| 0.76| 0.031|\n",
+ "| VAUX | | | 1.35|\n",
+ "\n",
+ "FPGA and ADC's will be powered from the 12V input, while board monitoring and test signal generators will be powered from the 3.3V input. \n",
+ "\n",
+ "```{tip}\n",
+ "Use *limits* on components like Converters (input voltage range, output current) and LinRegs (output voltage and current) to get warnings if component voltages or currents are out of spec. \n",
+ "```\n",
+ "\n",
+ "Buck converter efficiency is defined as interpolation data. The subsystems are defined in functions for easy manipulation of key system parameters and system architecture."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "47140e30-4db4-4d4d-93ea-3e72769df775",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "eff_2v3 = {\"vi\":[12], \"io\":[1e-3, 1, 2, 3, 4, 5], \"eff\":[[0.45, 0.95, 0.94, 0.925, 0.9, 0.88]]}\n",
+ "eff_1v7 = {\"vi\":[12], \"io\":[1e-3, 1, 2, 3, 4, 5], \"eff\":[[0.33, 0.92, 0.92, 0.91, 0.9, 0.875]]}\n",
+ "eff_0v85 = {\"vi\":[12], \"io\":[1, 2, 5, 10, 20, 30], \"eff\":[[0.48, 0.7, 0.86, 0.9, 0.87, 0.84]]} \n",
+ "eff_1v8 = {\"vi\":[12], \"io\":[.1, .25, .5, 1.0, 1.5, 2.0], \"eff\":[[0.63, 0.82, 0.86, 0.9, 0.9, 0.885]]}\n",
+ "eff_0v9 = {\"vi\":[12], \"io\":[.1, .25, .5, 1.0, 1.5, 2.0], \"eff\":[[0.54, 0.75, 0.82, 0.85, 0.84, 0.83]]}\n",
+ "eff_1v2 = {\"vi\":[12], \"io\":[.01, .1, .5, 1.0, 2.0, 4.0], \"eff\":[[0.72, 0.78, 0.84, 0.88, 0.87, 0.8]]}\n",
+ "\n",
+ "def adc_subsystem(sys, channel, src):\n",
+ " idx = \"[{}]\".format(channel+1)\n",
+ " sys.add_comp(src, comp=Converter(\"ADC\"+idx+\" buck 2.3V\", vo=2.3, eff=eff_2v3))\n",
+ " sys.add_comp(\"ADC\"+idx+\" buck 2.3V\", comp=RLoss(\"ADC\"+idx+\" ferrit1\", rs=0.087))\n",
+ " sys.add_comp(\"ADC\"+idx+\" ferrit1\", comp=LinReg(\"ADC\"+idx+\" LDO 1.8V\", vo=1.8, iq=0.5, vdrop=0.15, limits={\"vo\":[1.8, 1.8]}))\n",
+ " sys.add_comp(\"ADC\"+idx+\" LDO 1.8V\", comp=ILoad(\"ADC\"+idx+\" AVVD18\", ii=0.5))\n",
+ " sys.add_comp(src, comp=Converter(\"ADC\"+idx+\" buck 1.7V\", vo=1.7, eff=eff_1v7))\n",
+ " sys.add_comp(\"ADC\"+idx+\" buck 1.7V\", comp=RLoss(\"ADC\"+idx+\" ferrit2\", rs=0.103))\n",
+ " sys.add_comp(\"ADC\"+idx+\" ferrit2\", comp=LinReg(\"ADC\"+idx+\" LDO[1] 1.2V\", vo=1.2, iq=0.23, vdrop=0.15, limits={\"vo\":[1.2, 1.2]}))\n",
+ " sys.add_comp(\"ADC\"+idx+\" LDO[1] 1.2V\", comp=ILoad(\"ADC\"+idx+\" AVVD12\", ii=0.74))\n",
+ " sys.add_comp(\"ADC\"+idx+\" ferrit2\", comp=LinReg(\"ADC\"+idx+\" LDO[2] 1.2V\", vo=1.2, iq=0.23, vdrop=0.15, limits={\"vo\":[1.2, 1.2]}))\n",
+ " sys.add_comp(\"ADC\"+idx+\" LDO[2] 1.2V\", comp=ILoad(\"ADC\"+idx+\" CLKVDD\", ii=0.086))\n",
+ " sys.add_comp(\"ADC\"+idx+\" ferrit2\", comp=LinReg(\"ADC\"+idx+\" LDO[3] 1.2V\", vo=1.2, iq=0.23, vdrop=0.15, limits={\"vo\":[1.2, 1.2]}))\n",
+ " sys.add_comp(\"ADC\"+idx+\" LDO[3] 1.2V\", comp=ILoad(\"ADC\"+idx+\" DVDD\", ii=1.41))\n",
+ " return sys\n",
+ "\n",
+ "def fpga_subsystem(sys, channels, src):\n",
+ " sys.add_comp(src, comp=Converter(\"FPGA VCCINT\", vo=0.85, eff=eff_0v85, limits={\"io\":[0.0, 30.0]}))\n",
+ " sys.add_comp(\"FPGA VCCINT\", comp=PLoad(\"FPGA INT static\", pwr=1.67))\n",
+ " sys.add_comp(\"FPGA VCCINT\", comp=PLoad(\"FPGA INT dynamic\", pwr=1.25+channels*1.58))\n",
+ " # VCCAUX\n",
+ " sys.add_comp(src, comp=Converter(\"FPGA VCCAUX\", vo=1.8, eff=eff_1v8, limits={\"io\":[0.0, 2.0]}))\n",
+ " sys.add_comp(\"FPGA VCCAUX\", comp=PLoad(\"FPGA AUX static\", pwr=1.35))\n",
+ " # AVCC\n",
+ " sys.add_comp(src, comp=Converter(\"FPGA AVCC\", vo=0.9, eff=eff_0v9, limits={\"io\":[0.0, 2.0]}))\n",
+ " sys.add_comp(\"FPGA AVCC\", comp=PLoad(\"FPGA AVCC static\", pwr=0.57))\n",
+ " sys.add_comp(\"FPGA AVCC\", comp=PLoad(\"FPGA AVCC dynamic\", pwr=0.45+channels*0.051))\n",
+ " # AVTT\n",
+ " sys.add_comp(src, comp=Converter(\"FPGA AVTT\", vo=1.2, eff=eff_1v2, limits={\"io\":[0.0, 4.0]}))\n",
+ " sys.add_comp(\"FPGA AVTT\", comp=PLoad(\"FPGA AVTT static\", pwr=0.031))\n",
+ " sys.add_comp(\"FPGA AVTT\", comp=PLoad(\"FPGA AVTT dynamic\", pwr=0.76+channels*0.22))\n",
+ " sys.add_comp(src, comp=ILoad(\"Board fan\", ii=0.06))\n",
+ " return sys\n",
+ "\n",
+ "def PCIe_system(channels):\n",
+ " # power inputs 12V and 3.3V with current limits set to PCIe spec.\n",
+ " sys = System(\"PCIe FPGA board\", source=Source(\"12V\", vo=12.0, limits={\"io\":[0.0, 5.5]}))\n",
+ " sys.add_source(Source(\"3.3V\", vo=3.3, limits={\"io\":[0.0, 3.0]}))\n",
+ " # 3.3V subsystem\n",
+ " sys.add_comp(\"3.3V\", comp=Converter(\"Buck 2.5V\", vo=2.5, eff=eff_2v3))\n",
+ " sys.add_comp(\"Buck 2.5V\", comp=PLoad(\"Board monitor\", pwr=0.35))\n",
+ " sys.add_comp(\"Buck 2.5V\", comp=PLoad(\"Signal generators\", pwr=1.55))\n",
+ " # FPGA subsystem\n",
+ " sys = fpga_subsystem(sys, channels, \"12V\")\n",
+ " # ADC channels\n",
+ " for i in range(channels):\n",
+ " sys = adc_subsystem(sys, i, \"12V\")\n",
+ " return sys"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "93e6215c-b07d-4707-9a13-a15bd43a9635",
+ "metadata": {},
+ "source": [
+ "## Analysis\n",
+ "We start by looking at the power tree and power consumption for a one channel board:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "5a22a5b7-951f-4254-8ef6-a014de81d855",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "PCIe FPGA board\n",
+ "├── 3.3V\n",
+ "│ └── Buck 2.5V\n",
+ "│ ├── Signal generators\n",
+ "│ └── Board monitor\n",
+ "└── 12V\n",
+ " ├── ADC[1] buck 1.7V\n",
+ " │ └── ADC[1] ferrit2\n",
+ " │ ├── ADC[1] LDO[3] 1.2V\n",
+ " │ │ └── ADC[1] DVDD\n",
+ " │ ├── ADC[1] LDO[2] 1.2V\n",
+ " │ │ └── ADC[1] CLKVDD\n",
+ " │ └── ADC[1] LDO[1] 1.2V\n",
+ " │ └── ADC[1] AVVD12\n",
+ " ├── ADC[1] buck 2.3V\n",
+ " │ └── ADC[1] ferrit1\n",
+ " │ └── ADC[1] LDO 1.8V\n",
+ " │ └── ADC[1] AVVD18\n",
+ " ├── Board fan\n",
+ " ├── FPGA AVTT\n",
+ " │ ├── FPGA AVTT dynamic\n",
+ " │ └── FPGA AVTT static\n",
+ " ├── FPGA AVCC\n",
+ " │ ├── FPGA AVCC dynamic\n",
+ " │ └── FPGA AVCC static\n",
+ " ├── FPGA VCCAUX\n",
+ " │ └── FPGA AUX static\n",
+ " └── FPGA VCCINT\n",
+ " ├── FPGA INT dynamic\n",
+ " └── FPGA INT static\n",
+ " \n"
+ ],
+ "text/plain": [
+ "PCIe FPGA board\n",
+ "├── 3.3V\n",
+ "│ └── Buck 2.5V\n",
+ "│ ├── Signal generators\n",
+ "│ └── Board monitor\n",
+ "└── 12V\n",
+ " ├── ADC[1] buck 1.7V\n",
+ " │ └── ADC[1] ferrit2\n",
+ " │ ├── ADC[1] LDO[3] 1.2V\n",
+ " │ │ └── ADC[1] DVDD\n",
+ " │ ├── ADC[1] LDO[2] 1.2V\n",
+ " │ │ └── ADC[1] CLKVDD\n",
+ " │ └── ADC[1] LDO[1] 1.2V\n",
+ " │ └── ADC[1] AVVD12\n",
+ " ├── ADC[1] buck 2.3V\n",
+ " │ └── ADC[1] ferrit1\n",
+ " │ └── ADC[1] LDO 1.8V\n",
+ " │ └── ADC[1] AVVD18\n",
+ " ├── Board fan\n",
+ " ├── FPGA AVTT\n",
+ " │ ├── FPGA AVTT dynamic\n",
+ " │ └── FPGA AVTT static\n",
+ " ├── FPGA AVCC\n",
+ " │ ├── FPGA AVCC dynamic\n",
+ " │ └── FPGA AVCC static\n",
+ " ├── FPGA VCCAUX\n",
+ " │ └── FPGA AUX static\n",
+ " └── FPGA VCCINT\n",
+ " ├── FPGA INT dynamic\n",
+ " └── FPGA INT static\n"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "sys = PCIe_system(1)\n",
+ "sys.tree()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "b5bb665c-d90a-42ab-80b0-8f7cf244700c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Component \n",
+ " Type \n",
+ " Parent \n",
+ " Domain \n",
+ " Vin (V) \n",
+ " Vout (V) \n",
+ " Iin (A) \n",
+ " Iout (A) \n",
+ " Power (W) \n",
+ " Loss (W) \n",
+ " Efficiency (%) \n",
+ " Warnings \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 3.3V \n",
+ " SOURCE \n",
+ " \n",
+ " 3.3V \n",
+ " 3.3 \n",
+ " 3.3 \n",
+ " 0.693784 \n",
+ " 0.693784 \n",
+ " 2.289488 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " Buck 2.5V \n",
+ " CONVERTER \n",
+ " 3.3V \n",
+ " 3.3V \n",
+ " 3.3 \n",
+ " 2.5 \n",
+ " 0.693784 \n",
+ " 0.76 \n",
+ " 2.289488 \n",
+ " 0.389488 \n",
+ " 82.987988 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " Signal generators \n",
+ " LOAD \n",
+ " Buck 2.5V \n",
+ " 3.3V \n",
+ " 2.5 \n",
+ " 0.0 \n",
+ " 0.62 \n",
+ " 0.0 \n",
+ " 1.55 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " Board monitor \n",
+ " LOAD \n",
+ " Buck 2.5V \n",
+ " 3.3V \n",
+ " 2.5 \n",
+ " 0.0 \n",
+ " 0.14 \n",
+ " 0.0 \n",
+ " 0.35 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 12V \n",
+ " SOURCE \n",
+ " \n",
+ " 12V \n",
+ " 12.0 \n",
+ " 12.0 \n",
+ " 1.307449 \n",
+ " 1.307449 \n",
+ " 15.689392 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " ADC[1] buck 1.7V \n",
+ " CONVERTER \n",
+ " 12V \n",
+ " 12V \n",
+ " 12.0 \n",
+ " 1.7 \n",
+ " 0.345197 \n",
+ " 2.236 \n",
+ " 4.142365 \n",
+ " 0.341165 \n",
+ " 91.764 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " ADC[1] ferrit2 \n",
+ " SLOSS \n",
+ " ADC[1] buck 1.7V \n",
+ " 12V \n",
+ " 1.7 \n",
+ " 1.469692 \n",
+ " 2.236 \n",
+ " 2.236 \n",
+ " 3.8012 \n",
+ " 0.514969 \n",
+ " 86.452471 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " ADC[1] LDO[3] 1.2V \n",
+ " LINREG \n",
+ " ADC[1] ferrit2 \n",
+ " 12V \n",
+ " 1.469692 \n",
+ " 1.2 \n",
+ " 1.41 \n",
+ " 1.41 \n",
+ " 2.072266 \n",
+ " 0.380266 \n",
+ " 81.649761 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " ADC[1] DVDD \n",
+ " LOAD \n",
+ " ADC[1] LDO[3] 1.2V \n",
+ " 12V \n",
+ " 1.2 \n",
+ " 0.0 \n",
+ " 1.41 \n",
+ " 0.0 \n",
+ " 1.692 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " ADC[1] LDO[2] 1.2V \n",
+ " LINREG \n",
+ " ADC[1] ferrit2 \n",
+ " 12V \n",
+ " 1.469692 \n",
+ " 1.2 \n",
+ " 0.086 \n",
+ " 0.086 \n",
+ " 0.126394 \n",
+ " 0.023194 \n",
+ " 81.649761 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " ADC[1] CLKVDD \n",
+ " LOAD \n",
+ " ADC[1] LDO[2] 1.2V \n",
+ " 12V \n",
+ " 1.2 \n",
+ " 0.0 \n",
+ " 0.086 \n",
+ " 0.0 \n",
+ " 0.1032 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " ADC[1] LDO[1] 1.2V \n",
+ " LINREG \n",
+ " ADC[1] ferrit2 \n",
+ " 12V \n",
+ " 1.469692 \n",
+ " 1.2 \n",
+ " 0.74 \n",
+ " 0.74 \n",
+ " 1.087572 \n",
+ " 0.199572 \n",
+ " 81.649761 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " ADC[1] AVVD12 \n",
+ " LOAD \n",
+ " ADC[1] LDO[1] 1.2V \n",
+ " 12V \n",
+ " 1.2 \n",
+ " 0.0 \n",
+ " 0.74 \n",
+ " 0.0 \n",
+ " 0.888 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 13 \n",
+ " ADC[1] buck 2.3V \n",
+ " CONVERTER \n",
+ " 12V \n",
+ " 12V \n",
+ " 12.0 \n",
+ " 2.3 \n",
+ " 0.136954 \n",
+ " 0.5 \n",
+ " 1.643445 \n",
+ " 0.493445 \n",
+ " 69.974975 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 14 \n",
+ " ADC[1] ferrit1 \n",
+ " SLOSS \n",
+ " ADC[1] buck 2.3V \n",
+ " 12V \n",
+ " 2.3 \n",
+ " 2.2565 \n",
+ " 0.5 \n",
+ " 0.5 \n",
+ " 1.15 \n",
+ " 0.02175 \n",
+ " 98.108696 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 15 \n",
+ " ADC[1] LDO 1.8V \n",
+ " LINREG \n",
+ " ADC[1] ferrit1 \n",
+ " 12V \n",
+ " 2.2565 \n",
+ " 1.8 \n",
+ " 0.5 \n",
+ " 0.5 \n",
+ " 1.12825 \n",
+ " 0.22825 \n",
+ " 79.769555 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 16 \n",
+ " ADC[1] AVVD18 \n",
+ " LOAD \n",
+ " ADC[1] LDO 1.8V \n",
+ " 12V \n",
+ " 1.8 \n",
+ " 0.0 \n",
+ " 0.5 \n",
+ " 0.0 \n",
+ " 0.9 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 17 \n",
+ " Board fan \n",
+ " LOAD \n",
+ " 12V \n",
+ " 12V \n",
+ " 12.0 \n",
+ " 0.0 \n",
+ " 0.06 \n",
+ " 0.0 \n",
+ " 0.72 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " FPGA AVTT \n",
+ " CONVERTER \n",
+ " 12V \n",
+ " 12V \n",
+ " 12.0 \n",
+ " 1.2 \n",
+ " 0.097129 \n",
+ " 0.8425 \n",
+ " 1.165552 \n",
+ " 0.154552 \n",
+ " 86.74 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 19 \n",
+ " FPGA AVTT dynamic \n",
+ " LOAD \n",
+ " FPGA AVTT \n",
+ " 12V \n",
+ " 1.2 \n",
+ " 0.0 \n",
+ " 0.816667 \n",
+ " 0.0 \n",
+ " 0.98 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 20 \n",
+ " FPGA AVTT static \n",
+ " LOAD \n",
+ " FPGA AVTT \n",
+ " 12V \n",
+ " 1.2 \n",
+ " 0.0 \n",
+ " 0.025833 \n",
+ " 0.0 \n",
+ " 0.031 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 21 \n",
+ " FPGA AVCC \n",
+ " CONVERTER \n",
+ " 12V \n",
+ " 12V \n",
+ " 12.0 \n",
+ " 0.9 \n",
+ " 0.105472 \n",
+ " 1.19 \n",
+ " 1.265658 \n",
+ " 0.194658 \n",
+ " 84.62 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 22 \n",
+ " FPGA AVCC dynamic \n",
+ " LOAD \n",
+ " FPGA AVCC \n",
+ " 12V \n",
+ " 0.9 \n",
+ " 0.0 \n",
+ " 0.556667 \n",
+ " 0.0 \n",
+ " 0.501 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 23 \n",
+ " FPGA AVCC static \n",
+ " LOAD \n",
+ " FPGA AVCC \n",
+ " 12V \n",
+ " 0.9 \n",
+ " 0.0 \n",
+ " 0.633333 \n",
+ " 0.0 \n",
+ " 0.57 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 24 \n",
+ " FPGA VCCAUX \n",
+ " CONVERTER \n",
+ " 12V \n",
+ " 12V \n",
+ " 12.0 \n",
+ " 1.8 \n",
+ " 0.127841 \n",
+ " 0.75 \n",
+ " 1.534091 \n",
+ " 0.184091 \n",
+ " 88.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 25 \n",
+ " FPGA AUX static \n",
+ " LOAD \n",
+ " FPGA VCCAUX \n",
+ " 12V \n",
+ " 1.8 \n",
+ " 0.0 \n",
+ " 0.75 \n",
+ " 0.0 \n",
+ " 1.35 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 26 \n",
+ " FPGA VCCINT \n",
+ " CONVERTER \n",
+ " 12V \n",
+ " 12V \n",
+ " 12.0 \n",
+ " 0.85 \n",
+ " 0.434857 \n",
+ " 5.294118 \n",
+ " 5.218281 \n",
+ " 0.718281 \n",
+ " 86.235294 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 27 \n",
+ " FPGA INT dynamic \n",
+ " LOAD \n",
+ " FPGA VCCINT \n",
+ " 12V \n",
+ " 0.85 \n",
+ " 0.0 \n",
+ " 3.329412 \n",
+ " 0.0 \n",
+ " 2.83 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 28 \n",
+ " FPGA INT static \n",
+ " LOAD \n",
+ " FPGA VCCINT \n",
+ " 12V \n",
+ " 0.85 \n",
+ " 0.0 \n",
+ " 1.964706 \n",
+ " 0.0 \n",
+ " 1.67 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 29 \n",
+ " Subsystem 3.3V \n",
+ " \n",
+ " \n",
+ " \n",
+ " 3.3 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 2.289488 \n",
+ " 0.389488 \n",
+ " 82.987988 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 30 \n",
+ " Subsystem 12V \n",
+ " \n",
+ " \n",
+ " \n",
+ " 12.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 15.689392 \n",
+ " 3.454192 \n",
+ " 77.9839 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 31 \n",
+ " System total \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 17.97888 \n",
+ " 3.84368 \n",
+ " 78.621137 \n",
+ " \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Component Type Parent Domain Vin (V) \\\n",
+ "0 3.3V SOURCE 3.3V 3.3 \n",
+ "1 Buck 2.5V CONVERTER 3.3V 3.3V 3.3 \n",
+ "2 Signal generators LOAD Buck 2.5V 3.3V 2.5 \n",
+ "3 Board monitor LOAD Buck 2.5V 3.3V 2.5 \n",
+ "4 12V SOURCE 12V 12.0 \n",
+ "5 ADC[1] buck 1.7V CONVERTER 12V 12V 12.0 \n",
+ "6 ADC[1] ferrit2 SLOSS ADC[1] buck 1.7V 12V 1.7 \n",
+ "7 ADC[1] LDO[3] 1.2V LINREG ADC[1] ferrit2 12V 1.469692 \n",
+ "8 ADC[1] DVDD LOAD ADC[1] LDO[3] 1.2V 12V 1.2 \n",
+ "9 ADC[1] LDO[2] 1.2V LINREG ADC[1] ferrit2 12V 1.469692 \n",
+ "10 ADC[1] CLKVDD LOAD ADC[1] LDO[2] 1.2V 12V 1.2 \n",
+ "11 ADC[1] LDO[1] 1.2V LINREG ADC[1] ferrit2 12V 1.469692 \n",
+ "12 ADC[1] AVVD12 LOAD ADC[1] LDO[1] 1.2V 12V 1.2 \n",
+ "13 ADC[1] buck 2.3V CONVERTER 12V 12V 12.0 \n",
+ "14 ADC[1] ferrit1 SLOSS ADC[1] buck 2.3V 12V 2.3 \n",
+ "15 ADC[1] LDO 1.8V LINREG ADC[1] ferrit1 12V 2.2565 \n",
+ "16 ADC[1] AVVD18 LOAD ADC[1] LDO 1.8V 12V 1.8 \n",
+ "17 Board fan LOAD 12V 12V 12.0 \n",
+ "18 FPGA AVTT CONVERTER 12V 12V 12.0 \n",
+ "19 FPGA AVTT dynamic LOAD FPGA AVTT 12V 1.2 \n",
+ "20 FPGA AVTT static LOAD FPGA AVTT 12V 1.2 \n",
+ "21 FPGA AVCC CONVERTER 12V 12V 12.0 \n",
+ "22 FPGA AVCC dynamic LOAD FPGA AVCC 12V 0.9 \n",
+ "23 FPGA AVCC static LOAD FPGA AVCC 12V 0.9 \n",
+ "24 FPGA VCCAUX CONVERTER 12V 12V 12.0 \n",
+ "25 FPGA AUX static LOAD FPGA VCCAUX 12V 1.8 \n",
+ "26 FPGA VCCINT CONVERTER 12V 12V 12.0 \n",
+ "27 FPGA INT dynamic LOAD FPGA VCCINT 12V 0.85 \n",
+ "28 FPGA INT static LOAD FPGA VCCINT 12V 0.85 \n",
+ "29 Subsystem 3.3V 3.3 \n",
+ "30 Subsystem 12V 12.0 \n",
+ "31 System total \n",
+ "\n",
+ " Vout (V) Iin (A) Iout (A) Power (W) Loss (W) Efficiency (%) Warnings \n",
+ "0 3.3 0.693784 0.693784 2.289488 0.0 100.0 \n",
+ "1 2.5 0.693784 0.76 2.289488 0.389488 82.987988 \n",
+ "2 0.0 0.62 0.0 1.55 0.0 100.0 \n",
+ "3 0.0 0.14 0.0 0.35 0.0 100.0 \n",
+ "4 12.0 1.307449 1.307449 15.689392 0.0 100.0 \n",
+ "5 1.7 0.345197 2.236 4.142365 0.341165 91.764 \n",
+ "6 1.469692 2.236 2.236 3.8012 0.514969 86.452471 \n",
+ "7 1.2 1.41 1.41 2.072266 0.380266 81.649761 \n",
+ "8 0.0 1.41 0.0 1.692 0.0 100.0 \n",
+ "9 1.2 0.086 0.086 0.126394 0.023194 81.649761 \n",
+ "10 0.0 0.086 0.0 0.1032 0.0 100.0 \n",
+ "11 1.2 0.74 0.74 1.087572 0.199572 81.649761 \n",
+ "12 0.0 0.74 0.0 0.888 0.0 100.0 \n",
+ "13 2.3 0.136954 0.5 1.643445 0.493445 69.974975 \n",
+ "14 2.2565 0.5 0.5 1.15 0.02175 98.108696 \n",
+ "15 1.8 0.5 0.5 1.12825 0.22825 79.769555 \n",
+ "16 0.0 0.5 0.0 0.9 0.0 100.0 \n",
+ "17 0.0 0.06 0.0 0.72 0.0 100.0 \n",
+ "18 1.2 0.097129 0.8425 1.165552 0.154552 86.74 \n",
+ "19 0.0 0.816667 0.0 0.98 0.0 100.0 \n",
+ "20 0.0 0.025833 0.0 0.031 0.0 100.0 \n",
+ "21 0.9 0.105472 1.19 1.265658 0.194658 84.62 \n",
+ "22 0.0 0.556667 0.0 0.501 0.0 100.0 \n",
+ "23 0.0 0.633333 0.0 0.57 0.0 100.0 \n",
+ "24 1.8 0.127841 0.75 1.534091 0.184091 88.0 \n",
+ "25 0.0 0.75 0.0 1.35 0.0 100.0 \n",
+ "26 0.85 0.434857 5.294118 5.218281 0.718281 86.235294 \n",
+ "27 0.0 3.329412 0.0 2.83 0.0 100.0 \n",
+ "28 0.0 1.964706 0.0 1.67 0.0 100.0 \n",
+ "29 2.289488 0.389488 82.987988 \n",
+ "30 15.689392 3.454192 77.9839 \n",
+ "31 17.97888 3.84368 78.621137 "
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "sys.solve()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d99cac7e-1d5d-42b3-84aa-adef1ef0c252",
+ "metadata": {},
+ "source": [
+ "```{note}\n",
+ "When the system has more than one voltage source, a new column *Domain* appears in the results table. The name of the source (voltage domain) of each component is listed here.\n",
+ "```\n",
+ "Next, we check power consumption for ADC count between 1 and 12:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "41c355a7-717c-4304-9fdd-14db11fc8b5c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ " \n",
+ " \n",
+ " Component \n",
+ " ADCs \n",
+ " Power (W) \n",
+ " Loss (W) \n",
+ " Efficiency (%) \n",
+ " Warnings \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " System total \n",
+ " 1 \n",
+ " 17.978880 \n",
+ " 3.843680 \n",
+ " 78.621137 \n",
+ " \n",
+ " \n",
+ " \n",
+ " System total \n",
+ " 2 \n",
+ " 25.773138 \n",
+ " 6.203738 \n",
+ " 75.929444 \n",
+ " \n",
+ " \n",
+ " \n",
+ " System total \n",
+ " 3 \n",
+ " 33.530259 \n",
+ " 8.526659 \n",
+ " 74.570256 \n",
+ " \n",
+ " \n",
+ " \n",
+ " System total \n",
+ " 4 \n",
+ " 41.343038 \n",
+ " 10.905238 \n",
+ " 73.622553 \n",
+ " \n",
+ " \n",
+ " \n",
+ " System total \n",
+ " 5 \n",
+ " 49.283102 \n",
+ " 13.411102 \n",
+ " 72.787626 \n",
+ " \n",
+ " \n",
+ " \n",
+ " System total \n",
+ " 6 \n",
+ " 57.247516 \n",
+ " 15.941316 \n",
+ " 72.153698 \n",
+ " \n",
+ " \n",
+ " \n",
+ " System total \n",
+ " 7 \n",
+ " 65.236725 \n",
+ " 18.496325 \n",
+ " 71.647373 \n",
+ " \n",
+ " \n",
+ " \n",
+ " System total \n",
+ " 8 \n",
+ " 73.261860 \n",
+ " 21.087260 \n",
+ " 71.216593 \n",
+ " Yes \n",
+ " \n",
+ " \n",
+ " System total \n",
+ " 9 \n",
+ " 81.320128 \n",
+ " 23.711328 \n",
+ " 70.841994 \n",
+ " Yes \n",
+ " \n",
+ " \n",
+ " System total \n",
+ " 10 \n",
+ " 89.407683 \n",
+ " 26.364683 \n",
+ " 70.511838 \n",
+ " Yes \n",
+ " \n",
+ " \n",
+ " System total \n",
+ " 11 \n",
+ " 97.525106 \n",
+ " 29.047906 \n",
+ " 70.214946 \n",
+ " Yes \n",
+ " \n",
+ " \n",
+ " System total \n",
+ " 12 \n",
+ " 105.672994 \n",
+ " 31.761594 \n",
+ " 69.943509 \n",
+ " Yes \n",
+ " \n",
+ " \n",
+ "
\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "res = []\n",
+ "for cnt in range(1,13):\n",
+ " psys = PCIe_system(channels=cnt)\n",
+ " res += [psys.solve(tags={\"ADCs\":cnt})]\n",
+ "df = pd.concat(res, ignore_index=True)\n",
+ "df[df.Component == \"System total\"][[\"Component\", \"ADCs\", \"Power (W)\", \"Loss (W)\", \"Efficiency (%)\", \"Warnings\"]].style.hide(axis='index')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "21e3c5d4-66e5-44a9-8fdd-bd097b6394e4",
+ "metadata": {},
+ "source": [
+ "We see that 7 ADC channels are the most we can power. From 8 channels and up we get warnings. Even though the 8-channel case has a system total power of 73W which is less than 75W PCIe specifications, the current drawn from the 12V supply is too high. Let's look at the 12V input current (the PCIe specification says max 5.5A):"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "5415b73c-16e8-4004-8f49-c647988fee88",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ " \n",
+ " \n",
+ " Component \n",
+ " ADCs \n",
+ " Iout (A) \n",
+ " Power (W) \n",
+ " Warnings \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 12V \n",
+ " 1 \n",
+ " 1.307449 \n",
+ " 15.689392 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 12V \n",
+ " 2 \n",
+ " 1.956971 \n",
+ " 23.483650 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 12V \n",
+ " 3 \n",
+ " 2.603398 \n",
+ " 31.240771 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 12V \n",
+ " 4 \n",
+ " 3.254463 \n",
+ " 39.053550 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 12V \n",
+ " 5 \n",
+ " 3.916135 \n",
+ " 46.993614 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 12V \n",
+ " 6 \n",
+ " 4.579836 \n",
+ " 54.958028 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 12V \n",
+ " 7 \n",
+ " 5.245603 \n",
+ " 62.947237 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 12V \n",
+ " 8 \n",
+ " 5.914364 \n",
+ " 70.972372 \n",
+ " io \n",
+ " \n",
+ " \n",
+ " 12V \n",
+ " 9 \n",
+ " 6.585887 \n",
+ " 79.030640 \n",
+ " io \n",
+ " \n",
+ " \n",
+ " 12V \n",
+ " 10 \n",
+ " 7.259850 \n",
+ " 87.118195 \n",
+ " io \n",
+ " \n",
+ " \n",
+ " 12V \n",
+ " 11 \n",
+ " 7.936301 \n",
+ " 95.235618 \n",
+ " io \n",
+ " \n",
+ " \n",
+ " 12V \n",
+ " 12 \n",
+ " 8.615292 \n",
+ " 103.383506 \n",
+ " io \n",
+ " \n",
+ " \n",
+ "
\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df[df.Component == \"12V\"][[\"Component\", \"ADCs\", \"Iout (A)\", \"Power (W)\", \"Warnings\"]].style.hide(axis='index')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "99bb8444-6daf-4752-801f-2312271dcbb7",
+ "metadata": {},
+ "source": [
+ "With 8 channels, the 12V current is 5.91A, above the 5.5A limit in the PCIe specification.\n",
+ "\n",
+ "## System optimization\n",
+ "We can guess that the marketing department is not going to be happy to sell a 7-channel board - what can we do to get up to 8 channels? Looking at the analysis result above, the 3.3V supply is not fully utilized. So, we can try to power one extra channel from 3.3V. The ADC power circuit provides 2.3V as the highest voltage, so this will work fine. Converter efficiency will be better in fact operating from 3.3V than from 12V. The converter efficiency parameter needs an update for 3.3V input, and the system generating function assigns the first ADC channel to the 3.3V supply.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "2aef9671-b598-4841-863a-3878e71a5f1a",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# expand ADC buck converter parameters for 3.3V input\n",
+ "eff_2v3 = {\"vi\":[3.3, 12], \"io\":[1e-3, 1, 2, 3, 4, 5], \"eff\":[[0.63, 0.955, 0.96, 0.94, 0.92, 0.9],[0.45, 0.95, 0.94, 0.925, 0.9, 0.88]]}\n",
+ "eff_1v7 = {\"vi\":[3.3, 12], \"io\":[1e-3, 1, 2, 3, 4, 5], \"eff\":[[0.59, 0.94, 0.95, 0.92, 0.91, 0.89],[0.33, 0.92, 0.92, 0.91, 0.9, 0.875]]}\n",
+ "\n",
+ "# redefine system function to allocate one ADC to 3.3V supply\n",
+ "def PCIe_system(channels):\n",
+ " # power inputs 12V and 3.3V with current limits set to PCIe spec.\n",
+ " sys = System(\"PCIe FPGA board\", source=Source(\"12V\", vo=12.0, limits={\"io\":[0.0, 5.5]}))\n",
+ " sys.add_source(Source(\"3.3V\", vo=3.3, limits={\"io\":[0.0, 3.0]}))\n",
+ " # 3.3V subsystem\n",
+ " sys.add_comp(\"3.3V\", comp=Converter(\"Buck 2.5V\", vo=2.5, eff=eff_2v3))\n",
+ " sys.add_comp(\"Buck 2.5V\", comp=PLoad(\"Board monitor\", pwr=0.35))\n",
+ " sys.add_comp(\"Buck 2.5V\", comp=PLoad(\"Signal generators\", pwr=1.55))\n",
+ " # FPGA subsystem\n",
+ " sys = fpga_subsystem(sys, channels, \"12V\")\n",
+ " # ADC channels\n",
+ " for ch in range(channels):\n",
+ " if ch == 0:\n",
+ " sys = adc_subsystem(sys, ch, \"3.3V\")\n",
+ " else:\n",
+ " sys = adc_subsystem(sys, ch, \"12V\")\n",
+ " return sys"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "c1f67cb2-ad89-4594-af92-e487489499b2",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Component \n",
+ " Type \n",
+ " Parent \n",
+ " Domain \n",
+ " Vin (V) \n",
+ " Vout (V) \n",
+ " Iin (A) \n",
+ " Iout (A) \n",
+ " Power (W) \n",
+ " Loss (W) \n",
+ " Efficiency (%) \n",
+ " Warnings \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 3.3V \n",
+ " SOURCE \n",
+ " \n",
+ " 3.3V \n",
+ " 3.3 \n",
+ " 3.3 \n",
+ " 2.317993 \n",
+ " 2.317993 \n",
+ " 7.649379 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " ADC[1] buck 1.7V \n",
+ " CONVERTER \n",
+ " 3.3V \n",
+ " 3.3V \n",
+ " 3.3 \n",
+ " 1.7 \n",
+ " 1.221608 \n",
+ " 2.236 \n",
+ " 4.031307 \n",
+ " 0.230107 \n",
+ " 94.292 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " ADC[1] ferrit2 \n",
+ " SLOSS \n",
+ " ADC[1] buck 1.7V \n",
+ " 3.3V \n",
+ " 1.7 \n",
+ " 1.469692 \n",
+ " 2.236 \n",
+ " 2.236 \n",
+ " 3.8012 \n",
+ " 0.514969 \n",
+ " 86.452471 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " ADC[1] LDO[3] 1.2V \n",
+ " LINREG \n",
+ " ADC[1] ferrit2 \n",
+ " 3.3V \n",
+ " 1.469692 \n",
+ " 1.2 \n",
+ " 1.41 \n",
+ " 1.41 \n",
+ " 2.072266 \n",
+ " 0.380266 \n",
+ " 81.649761 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " ADC[1] DVDD \n",
+ " LOAD \n",
+ " ADC[1] LDO[3] 1.2V \n",
+ " 3.3V \n",
+ " 1.2 \n",
+ " 0.0 \n",
+ " 1.41 \n",
+ " 0.0 \n",
+ " 1.692 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 111 \n",
+ " FPGA INT dynamic \n",
+ " LOAD \n",
+ " FPGA VCCINT \n",
+ " 12V \n",
+ " 0.85 \n",
+ " 0.0 \n",
+ " 16.341176 \n",
+ " 0.0 \n",
+ " 13.89 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 112 \n",
+ " FPGA INT static \n",
+ " LOAD \n",
+ " FPGA VCCINT \n",
+ " 12V \n",
+ " 0.85 \n",
+ " 0.0 \n",
+ " 1.964706 \n",
+ " 0.0 \n",
+ " 1.67 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 113 \n",
+ " Subsystem 3.3V \n",
+ " \n",
+ " \n",
+ " \n",
+ " 3.3 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 7.649379 \n",
+ " 2.166179 \n",
+ " 71.68164 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 114 \n",
+ " Subsystem 12V \n",
+ " \n",
+ " \n",
+ " \n",
+ " 12.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 65.186562 \n",
+ " 18.495162 \n",
+ " 71.62734 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 115 \n",
+ " System total \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 72.83594 \n",
+ " 20.66134 \n",
+ " 71.633042 \n",
+ " \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
116 rows × 12 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Component Type Parent Domain Vin (V) \\\n",
+ "0 3.3V SOURCE 3.3V 3.3 \n",
+ "1 ADC[1] buck 1.7V CONVERTER 3.3V 3.3V 3.3 \n",
+ "2 ADC[1] ferrit2 SLOSS ADC[1] buck 1.7V 3.3V 1.7 \n",
+ "3 ADC[1] LDO[3] 1.2V LINREG ADC[1] ferrit2 3.3V 1.469692 \n",
+ "4 ADC[1] DVDD LOAD ADC[1] LDO[3] 1.2V 3.3V 1.2 \n",
+ ".. ... ... ... ... ... \n",
+ "111 FPGA INT dynamic LOAD FPGA VCCINT 12V 0.85 \n",
+ "112 FPGA INT static LOAD FPGA VCCINT 12V 0.85 \n",
+ "113 Subsystem 3.3V 3.3 \n",
+ "114 Subsystem 12V 12.0 \n",
+ "115 System total \n",
+ "\n",
+ " Vout (V) Iin (A) Iout (A) Power (W) Loss (W) Efficiency (%) \\\n",
+ "0 3.3 2.317993 2.317993 7.649379 0.0 100.0 \n",
+ "1 1.7 1.221608 2.236 4.031307 0.230107 94.292 \n",
+ "2 1.469692 2.236 2.236 3.8012 0.514969 86.452471 \n",
+ "3 1.2 1.41 1.41 2.072266 0.380266 81.649761 \n",
+ "4 0.0 1.41 0.0 1.692 0.0 100.0 \n",
+ ".. ... ... ... ... ... ... \n",
+ "111 0.0 16.341176 0.0 13.89 0.0 100.0 \n",
+ "112 0.0 1.964706 0.0 1.67 0.0 100.0 \n",
+ "113 7.649379 2.166179 71.68164 \n",
+ "114 65.186562 18.495162 71.62734 \n",
+ "115 72.83594 20.66134 71.633042 \n",
+ "\n",
+ " Warnings \n",
+ "0 \n",
+ "1 \n",
+ "2 \n",
+ "3 \n",
+ "4 \n",
+ ".. ... \n",
+ "111 \n",
+ "112 \n",
+ "113 \n",
+ "114 \n",
+ "115 \n",
+ "\n",
+ "[116 rows x 12 columns]"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "psys2 = PCIe_system(8)\n",
+ "psys2.solve()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c3e208cd-64b4-4890-895c-d754b451c4c9",
+ "metadata": {},
+ "source": [
+ "The 8-channel case is now within spec.\n",
+ "\n",
+ "## Summary\n",
+ "This notebook demonstrates how to define a complex system by splitting it up in subsystems and defining each subsystem separately. This enables easy exploration of different power architectures. We have also seen how key component parameters can be monitored by setting component limits."
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "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.11.8"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/nb/PCIeADC.png b/docs/nb/PCIeADC.png
new file mode 100644
index 0000000..f332bd3
Binary files /dev/null and b/docs/nb/PCIeADC.png differ
diff --git a/docs/nb/Sensor daisy chain.ipynb b/docs/nb/Sensor daisy chain.ipynb
new file mode 100644
index 0000000..ec3128d
--- /dev/null
+++ b/docs/nb/Sensor daisy chain.ipynb
@@ -0,0 +1,918 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "a85f6c63-5bef-4886-90a6-886c4bac4a15",
+ "metadata": {
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "# Sensor Daisy Chain\n",
+ "This tutorial will analyze a string of sensors wired as a daisy chain where the string is powered from one end. This configuration is common in e.g. instrumentation of production lines, seismic acquisitions systems etc.\n",
+ "\n",
+ "The system consists of the following components:\n",
+ " * A main acquisition unit, powered from a 14.4V Li-ion battery. A voltage booster powers the daisy chain with 48V.\n",
+ " * 16 sensor units, spaced 16m apart and connected with twisted pair wire for power. The sensor units consume 0.35W from 3.3V. The power input is polarity protected with a diode. A power switch enables power to the next unit. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "0ddf2bf4-d388-4195-aaaa-c0a4969b02b0",
+ "metadata": {
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": [
+ "remove-cell"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "# This cell can be removed, it is only used for running the notebook during Sphinx documentation build.\n",
+ "import sys, os\n",
+ "if os.getcwd().replace('\\\\', '/').endswith(\"/docs/nb\"):\n",
+ " sys.path.insert(0, os.path.abspath(os.path.join(\"../../src\")))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "3555e267-3e0a-4c54-8611-f498f616146e",
+ "metadata": {
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "from sysloss.components import *\n",
+ "from sysloss.system import System\n",
+ "import pandas as pd\n",
+ "import matplotlib.pyplot as plt"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3e9ec23a-db71-4f10-acac-81928ed90913",
+ "metadata": {
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "## System definition\n",
+ "The system is defined using the System class. \n",
+ "\n",
+ "```{tip}\n",
+ "When you want to analyze a system with variations on specific parameters, it can be very effective to define the system in a function, with target parameters as function arguments. \n",
+ "```\n",
+ "\n",
+ "Since we have 16 identical units, it is practical to use a loop to add the components. Wire resistance depends on wire gauge, and we define that as a parameter to the *create_sys()* function below. \n",
+ "\n",
+ "```{note}\n",
+ "Component names must be unique in the system. Use e.g. an index added to the name.\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "518f3900-0448-46d2-b371-317716fda96c",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def create_sys(wire_res=4.3, vdrop=0.54, eff=0.72):\n",
+ " sdc = System(\"Sensor Daisy chain\", Source(\"Li-ion\", vo=14.4, rs=0.2))\n",
+ " sdc.add_comp(\"Li-ion\", comp=Converter(\"Boost 48V\", vo=48.0, eff=.88))\n",
+ " parent = \"Boost 48V\"\n",
+ " for i in range(1,17,1):\n",
+ " idx = \" [{}]\".format(i)\n",
+ " sdc.add_comp(parent, comp=RLoss(\"Twisted pair\"+idx, rs=wire_res))\n",
+ " sdc.add_comp(\"Twisted pair\"+idx, comp=VLoss(\"Diode\"+idx, vdrop=vdrop))\n",
+ " sdc.add_comp(\"Diode\"+idx, comp=RLoss(\"Power switch\"+idx, rs=0.03))\n",
+ " sdc.add_comp(\"Diode\"+idx, comp=Converter(\"Buck 3.3V\"+idx, vo=3.3, eff=eff))\n",
+ " sdc.add_comp(\"Buck 3.3V\"+idx, comp=PLoad(\"Sensor unit\"+idx, pwr=0.35))\n",
+ " parent = \"Power switch\"+idx\n",
+ " return sdc"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "51973e01-2b51-4817-acdf-c43efa55a961",
+ "metadata": {},
+ "source": [
+ "This is a deep power tree (~50 levels), so let's look at the last few nodes only:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "0c6876b9-00b9-4ff0-ba9c-a08cb483a326",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "Sensor Daisy chain\n",
+ "└── Twisted pair [12]\n",
+ " └── Diode [12]\n",
+ " ├── Buck 3.3V [12]\n",
+ " │ └── Sensor unit [12]\n",
+ " └── Power switch [12]\n",
+ " └── Twisted pair [13]\n",
+ " └── Diode [13]\n",
+ " ├── Buck 3.3V [13]\n",
+ " │ └── Sensor unit [13]\n",
+ " └── Power switch [13]\n",
+ " └── Twisted pair [14]\n",
+ " └── Diode [14]\n",
+ " ├── Buck 3.3V [14]\n",
+ " │ └── Sensor unit [14]\n",
+ " └── Power switch [14]\n",
+ " └── Twisted pair [15]\n",
+ " └── Diode [15]\n",
+ " ├── Buck 3.3V [15]\n",
+ " │ └── Sensor unit [15]\n",
+ " └── Power switch [15]\n",
+ " └── Twisted pair [16]\n",
+ " └── Diode [16]\n",
+ " ├── Buck 3.3V [16]\n",
+ " │ └── Sensor unit [16]\n",
+ " └── Power switch [16]\n",
+ " \n"
+ ],
+ "text/plain": [
+ "Sensor Daisy chain\n",
+ "└── Twisted pair [12]\n",
+ " └── Diode [12]\n",
+ " ├── Buck 3.3V [12]\n",
+ " │ └── Sensor unit [12]\n",
+ " └── Power switch [12]\n",
+ " └── Twisted pair [13]\n",
+ " └── Diode [13]\n",
+ " ├── Buck 3.3V [13]\n",
+ " │ └── Sensor unit [13]\n",
+ " └── Power switch [13]\n",
+ " └── Twisted pair [14]\n",
+ " └── Diode [14]\n",
+ " ├── Buck 3.3V [14]\n",
+ " │ └── Sensor unit [14]\n",
+ " └── Power switch [14]\n",
+ " └── Twisted pair [15]\n",
+ " └── Diode [15]\n",
+ " ├── Buck 3.3V [15]\n",
+ " │ └── Sensor unit [15]\n",
+ " └── Power switch [15]\n",
+ " └── Twisted pair [16]\n",
+ " └── Diode [16]\n",
+ " ├── Buck 3.3V [16]\n",
+ " │ └── Sensor unit [16]\n",
+ " └── Power switch [16]\n"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "sdc = create_sys()\n",
+ "sdc.tree(\"Twisted pair [12]\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6ee33a0e-5aa3-4b2c-ade9-03ffb826f70b",
+ "metadata": {},
+ "source": [
+ "## Analysis\n",
+ "In the analysis phase we will check the power efficiency of the daisy chain with different wire gauges. Note that current runs both directions on the power pair, so effective resistance is twice that of a single wire.\n",
+ "|Wire gauge|Resistance (ohm/m)|\n",
+ "|----------:|------------------:|\n",
+ "| 20 | 0.0333|\n",
+ "| 22 | 0.053 |\n",
+ "| 24 | 0.084 |\n",
+ "| 26 | 0.134 |\n",
+ "| 28 | 0.213 |\n",
+ "\n",
+ "```{tip}\n",
+ "Use the *tags* argument of the *.solve()* function to tag the results table with custom columns.\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "d1be8ee8-af7d-4e65-9fac-7136e7acdcff",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Component \n",
+ " Type \n",
+ " Parent \n",
+ " Domain \n",
+ " Wire \n",
+ " Vin (V) \n",
+ " Vout (V) \n",
+ " Iin (A) \n",
+ " Iout (A) \n",
+ " Power (W) \n",
+ " Loss (W) \n",
+ " Efficiency (%) \n",
+ " Warnings \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " Li-ion \n",
+ " SOURCE \n",
+ " \n",
+ " Li-ion \n",
+ " AWG20 \n",
+ " 14.4 \n",
+ " 14.258269 \n",
+ " 0.708653 \n",
+ " 0.708653 \n",
+ " 10.204608 \n",
+ " 0.100438 \n",
+ " 99.015759 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " Boost 48V \n",
+ " CONVERTER \n",
+ " Li-ion \n",
+ " Li-ion \n",
+ " AWG20 \n",
+ " 14.258269 \n",
+ " 48.0 \n",
+ " 0.708653 \n",
+ " 0.185243 \n",
+ " 10.10417 \n",
+ " 1.2125 \n",
+ " 88.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " Twisted pair [1] \n",
+ " SLOSS \n",
+ " Boost 48V \n",
+ " Li-ion \n",
+ " AWG20 \n",
+ " 48.0 \n",
+ " 47.802605 \n",
+ " 0.185243 \n",
+ " 0.185243 \n",
+ " 8.89167 \n",
+ " 0.036566 \n",
+ " 99.58876 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " Diode [1] \n",
+ " SLOSS \n",
+ " Twisted pair [1] \n",
+ " Li-ion \n",
+ " AWG20 \n",
+ " 47.802605 \n",
+ " 47.262605 \n",
+ " 0.185243 \n",
+ " 0.185243 \n",
+ " 8.855109 \n",
+ " 0.100031 \n",
+ " 98.870354 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " Buck 3.3V [1] \n",
+ " CONVERTER \n",
+ " Diode [1] \n",
+ " Li-ion \n",
+ " AWG20 \n",
+ " 47.262605 \n",
+ " 3.3 \n",
+ " 0.010285 \n",
+ " 0.106061 \n",
+ " 0.486111 \n",
+ " 0.136111 \n",
+ " 72.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 410 \n",
+ " Diode [16] \n",
+ " SLOSS \n",
+ " Twisted pair [16] \n",
+ " Li-ion \n",
+ " AWG28 \n",
+ " 23.700235 \n",
+ " 23.160236 \n",
+ " 0.020989 \n",
+ " 0.020989 \n",
+ " 0.497445 \n",
+ " 0.011334 \n",
+ " 97.721542 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 411 \n",
+ " Buck 3.3V [16] \n",
+ " CONVERTER \n",
+ " Diode [16] \n",
+ " Li-ion \n",
+ " AWG28 \n",
+ " 23.160236 \n",
+ " 3.3 \n",
+ " 0.020989 \n",
+ " 0.106061 \n",
+ " 0.486111 \n",
+ " 0.136111 \n",
+ " 72.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 412 \n",
+ " Sensor unit [16] \n",
+ " LOAD \n",
+ " Buck 3.3V [16] \n",
+ " Li-ion \n",
+ " AWG28 \n",
+ " 3.3 \n",
+ " 0.0 \n",
+ " 0.106061 \n",
+ " 0.0 \n",
+ " 0.35 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 413 \n",
+ " Power switch [16] \n",
+ " SLOSS \n",
+ " Diode [16] \n",
+ " Li-ion \n",
+ " AWG28 \n",
+ " 23.160236 \n",
+ " 23.160236 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 100.0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " 414 \n",
+ " System total \n",
+ " \n",
+ " \n",
+ " \n",
+ " AWG28 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 13.815579 \n",
+ " 8.21569 \n",
+ " 40.533147 \n",
+ " \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
415 rows × 13 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Component Type Parent Domain Wire \\\n",
+ "0 Li-ion SOURCE Li-ion AWG20 \n",
+ "1 Boost 48V CONVERTER Li-ion Li-ion AWG20 \n",
+ "2 Twisted pair [1] SLOSS Boost 48V Li-ion AWG20 \n",
+ "3 Diode [1] SLOSS Twisted pair [1] Li-ion AWG20 \n",
+ "4 Buck 3.3V [1] CONVERTER Diode [1] Li-ion AWG20 \n",
+ ".. ... ... ... ... ... \n",
+ "410 Diode [16] SLOSS Twisted pair [16] Li-ion AWG28 \n",
+ "411 Buck 3.3V [16] CONVERTER Diode [16] Li-ion AWG28 \n",
+ "412 Sensor unit [16] LOAD Buck 3.3V [16] Li-ion AWG28 \n",
+ "413 Power switch [16] SLOSS Diode [16] Li-ion AWG28 \n",
+ "414 System total AWG28 \n",
+ "\n",
+ " Vin (V) Vout (V) Iin (A) Iout (A) Power (W) Loss (W) \\\n",
+ "0 14.4 14.258269 0.708653 0.708653 10.204608 0.100438 \n",
+ "1 14.258269 48.0 0.708653 0.185243 10.10417 1.2125 \n",
+ "2 48.0 47.802605 0.185243 0.185243 8.89167 0.036566 \n",
+ "3 47.802605 47.262605 0.185243 0.185243 8.855109 0.100031 \n",
+ "4 47.262605 3.3 0.010285 0.106061 0.486111 0.136111 \n",
+ ".. ... ... ... ... ... ... \n",
+ "410 23.700235 23.160236 0.020989 0.020989 0.497445 0.011334 \n",
+ "411 23.160236 3.3 0.020989 0.106061 0.486111 0.136111 \n",
+ "412 3.3 0.0 0.106061 0.0 0.35 0.0 \n",
+ "413 23.160236 23.160236 0.0 0.0 0.0 0.0 \n",
+ "414 13.815579 8.21569 \n",
+ "\n",
+ " Efficiency (%) Warnings \n",
+ "0 99.015759 \n",
+ "1 88.0 \n",
+ "2 99.58876 \n",
+ "3 98.870354 \n",
+ "4 72.0 \n",
+ ".. ... ... \n",
+ "410 97.721542 \n",
+ "411 72.0 \n",
+ "412 100.0 \n",
+ "413 100.0 \n",
+ "414 40.533147 \n",
+ "\n",
+ "[415 rows x 13 columns]"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "wlen = 16 * 2 # total wire length between sensor nodes\n",
+ "wirelist = {\"AWG20\": wlen*0.0333, \"AWG22\": wlen*0.053, \"AWG24\": wlen*0.084, \"AWG26\": wlen*0.134, \"AWG28\": wlen*0.213}\n",
+ "res = []\n",
+ "for wire in wirelist.keys():\n",
+ " sdc = create_sys(wire_res=wirelist[wire])\n",
+ " res += [sdc.solve(tags={\"Wire\":wire})]\n",
+ "df = pd.concat(res, ignore_index=True)\n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6866254f-1200-43ee-938b-e5a9da2a629a",
+ "metadata": {},
+ "source": [
+ "The results table is now quite large - let's look at the System total only:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "b77dcf5c-5cf2-44fd-86e3-3f2da9d81898",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ " \n",
+ " \n",
+ " Component \n",
+ " Wire \n",
+ " Power (W) \n",
+ " Loss (W) \n",
+ " Efficiency (%) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " System total \n",
+ " AWG20 \n",
+ " 10.204608 \n",
+ " 4.604640 \n",
+ " 54.876857 \n",
+ " \n",
+ " \n",
+ " System total \n",
+ " AWG22 \n",
+ " 10.403133 \n",
+ " 4.803176 \n",
+ " 53.829530 \n",
+ " \n",
+ " \n",
+ " System total \n",
+ " AWG24 \n",
+ " 10.758709 \n",
+ " 5.158768 \n",
+ " 52.050311 \n",
+ " \n",
+ " \n",
+ " System total \n",
+ " AWG26 \n",
+ " 11.497038 \n",
+ " 5.897114 \n",
+ " 48.707534 \n",
+ " \n",
+ " \n",
+ " System total \n",
+ " AWG28 \n",
+ " 13.815579 \n",
+ " 8.215690 \n",
+ " 40.533147 \n",
+ " \n",
+ " \n",
+ "
\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df[df.Component == \"System total\"][[\"Component\", \"Wire\", \"Power (W)\", \"Loss (W)\", \"Efficiency (%)\"]].style.hide(axis='index')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5fcb32b2-3650-4063-bc59-0b8bc5d818fc",
+ "metadata": {},
+ "source": [
+ "From the first table we can see that the output voltage from the last sensor node is 23.16V. Feeling optimistic - will it work with AWG30 also?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "ac7339d1-ff9d-4dce-96c2-c6dd24c4bcc0",
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "ValueError",
+ "evalue": "Unstable system: RLoss component 'Twisted pair [14]' has zero output voltage",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[1;32mIn[7], line 2\u001b[0m\n\u001b[0;32m 1\u001b[0m sdc \u001b[38;5;241m=\u001b[39m create_sys(wire_res\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m16\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m2\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m0.338\u001b[39m)\n\u001b[1;32m----> 2\u001b[0m sdc\u001b[38;5;241m.\u001b[39msolve()\n",
+ "File \u001b[1;32m~\\Documents\\tmp_sl\\src\\sysloss\\system.py:655\u001b[0m, in \u001b[0;36mSystem.solve\u001b[1;34m(self, vtol, itol, maxiter, quiet, phase, tags)\u001b[0m\n\u001b[0;32m 653\u001b[0m frames \u001b[38;5;241m=\u001b[39m []\n\u001b[0;32m 654\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m ph \u001b[38;5;129;01min\u001b[39;00m phase_list:\n\u001b[1;32m--> 655\u001b[0m v, i, iters \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_solve(vtol, itol, maxiter, quiet, ph)\n\u001b[0;32m 656\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m iters \u001b[38;5;241m>\u001b[39m maxiter:\n\u001b[0;32m 657\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(\n\u001b[0;32m 658\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSteady-state not achieved after \u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m iterations\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mformat(iters \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m1\u001b[39m)\n\u001b[0;32m 659\u001b[0m )\n",
+ "File \u001b[1;32m~\\Documents\\tmp_sl\\src\\sysloss\\system.py:587\u001b[0m, in \u001b[0;36mSystem._solve\u001b[1;34m(self, vtol, itol, maxiter, quiet, phase)\u001b[0m\n\u001b[0;32m 585\u001b[0m iters \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m\n\u001b[0;32m 586\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m iters \u001b[38;5;241m<\u001b[39m\u001b[38;5;241m=\u001b[39m maxiter:\n\u001b[1;32m--> 587\u001b[0m vi \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_fwd_prop(v, i, phase)\n\u001b[0;32m 588\u001b[0m ii \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_back_prop(vi, i, phase)\n\u001b[0;32m 589\u001b[0m iters \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m\n",
+ "File \u001b[1;32m~\\Documents\\tmp_sl\\src\\sysloss\\system.py:514\u001b[0m, in \u001b[0;36mSystem._fwd_prop\u001b[1;34m(self, v, i, phase)\u001b[0m\n\u001b[0;32m 506\u001b[0m vo[n] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_g[n]\u001b[38;5;241m.\u001b[39m_solv_outp_volt(\n\u001b[0;32m 507\u001b[0m \u001b[38;5;241m0.0\u001b[39m,\n\u001b[0;32m 508\u001b[0m \u001b[38;5;241m0.0\u001b[39m,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 511\u001b[0m phase_config,\n\u001b[0;32m 512\u001b[0m )\n\u001b[0;32m 513\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m--> 514\u001b[0m vo[n] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_g[n]\u001b[38;5;241m.\u001b[39m_solv_outp_volt(\n\u001b[0;32m 515\u001b[0m v[p[\u001b[38;5;241m0\u001b[39m]],\n\u001b[0;32m 516\u001b[0m i[n],\n\u001b[0;32m 517\u001b[0m isum,\n\u001b[0;32m 518\u001b[0m phase,\n\u001b[0;32m 519\u001b[0m phase_config,\n\u001b[0;32m 520\u001b[0m )\n\u001b[0;32m 521\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m vo\n",
+ "File \u001b[1;32m~\\Documents\\tmp_sl\\src\\sysloss\\components.py:567\u001b[0m, in \u001b[0;36mRLoss._solv_outp_volt\u001b[1;34m(self, vi, ii, io, phase, phase_conf)\u001b[0m\n\u001b[0;32m 565\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m np\u001b[38;5;241m.\u001b[39msign(vo) \u001b[38;5;241m==\u001b[39m np\u001b[38;5;241m.\u001b[39msign(vi):\n\u001b[0;32m 566\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m vo\n\u001b[1;32m--> 567\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[0;32m 568\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mUnstable system: RLoss component \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m has zero output voltage\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mformat(\n\u001b[0;32m 569\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_params[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mname\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[0;32m 570\u001b[0m )\n\u001b[0;32m 571\u001b[0m )\n",
+ "\u001b[1;31mValueError\u001b[0m: Unstable system: RLoss component 'Twisted pair [14]' has zero output voltage"
+ ]
+ }
+ ],
+ "source": [
+ "sdc = create_sys(wire_res=16*2*0.338)\n",
+ "sdc.solve()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "86bfb51f-bca0-486a-a971-e0365571a32b",
+ "metadata": {},
+ "source": [
+ "*.solve()* now throws an exception: The input voltage to sensor node 14 drops to zero. There is no steady-state solution for this system, so AWG30 is not an option. It would work with 13 sensor nodes, however.\n",
+ "\n",
+ "Finally, let's plot the voltage along the daisy chain for the different wire gauges."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "dbae86df-6073-4904-a607-a77843c945d1",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "for i in range(0,9,2):\n",
+ " plt.plot(range(1,17,1), df[(df.Component.str.startswith(\"Diode\")) & (df.Wire==\"AWG2\"+str(i))][[\"Vin (V)\"]].values, marker='.', label=\"AWG2\"+str(i))\n",
+ "plt.legend()\n",
+ "plt.xlabel(\"Sensor node #\")\n",
+ "plt.ylabel(\"Input voltage (V)\")\n",
+ "plt.grid()\n",
+ "plt.title(\"Daisy chain voltage distribution\");"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "01437e33-89f3-436e-ad74-d9a7f17a6860",
+ "metadata": {},
+ "source": [
+ "## Improve accuracy with parameter interpolation\n",
+ "Both current and voltage drop significantly along the daisy chain. The input voltage affects the 3.3V buck converter efficiency, and the current affects the diode forward voltage drop. Next, we define interpolation data for the diode voltage drop and converter efficiency, both as a factor of output current. The data points are extracted from the component's data sheet."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "fc9385d2-423d-4014-81e3-3422d6d354d9",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "diode_vdrop = {\"vi\": [48], \"io\":[1e-3, 1e-2, 0.1, 1, 5], \"vdrop\":[[.25, .325, 0.4, 0.65, 1.1]]}\n",
+ "buck_eff = {\"vi\": [48, 36, 24, 12], \"io\": [1e-3, 10e-3, 0.1, 0.2, 0.3], \n",
+ " \"eff\":[[0.61,0.63,0.66,0.68,0.69],[0.63,0.65,0.68,0.705,0.72],[0.66,.68,0.72,0.73,0.74],[0.7,0.72,0.76,0.78,0.77]]}"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "1a80a557-1a37-4826-9e65-4469a2746832",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ " \n",
+ " \n",
+ " Component \n",
+ " Wire \n",
+ " Power (W) \n",
+ " Loss (W) \n",
+ " Efficiency (%) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " System total \n",
+ " AWG20 \n",
+ " 10.677569 \n",
+ " 5.077636 \n",
+ " 52.445766 \n",
+ " \n",
+ " \n",
+ " System total \n",
+ " AWG22 \n",
+ " 10.862616 \n",
+ " 5.262711 \n",
+ " 51.552088 \n",
+ " \n",
+ " \n",
+ " System total \n",
+ " AWG24 \n",
+ " 11.191970 \n",
+ " 5.592065 \n",
+ " 50.035030 \n",
+ " \n",
+ " \n",
+ " System total \n",
+ " AWG26 \n",
+ " 11.843328 \n",
+ " 6.243451 \n",
+ " 47.282970 \n",
+ " \n",
+ " \n",
+ " System total \n",
+ " AWG28 \n",
+ " 13.532222 \n",
+ " 7.932379 \n",
+ " 41.381551 \n",
+ " \n",
+ " \n",
+ "
\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "res = []\n",
+ "for wire in wirelist.keys():\n",
+ " sdc = create_sys(wire_res=wirelist[wire], vdrop=diode_vdrop, eff=buck_eff)\n",
+ " res += [sdc.solve(tags={\"Wire\":wire})]\n",
+ "df = pd.concat(res, ignore_index=True)\n",
+ "df[df.Component == \"System total\"][[\"Component\", \"Wire\", \"Power (W)\", \"Loss (W)\", \"Efficiency (%)\"]].style.hide(axis='index')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "eae04940-5708-4eef-8cae-f97d09702402",
+ "metadata": {},
+ "source": [
+ "Let's look at the converter efficiency and diode power loss as a function of wire gauge:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "0ea2467a-ee1f-4a33-9a43-e043ef249ace",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjMAAAHFCAYAAAAHcXhbAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAADGFElEQVR4nOzdd3SUZf738ffMZNJ7L4Q0IHQBQbohSOiIq3RpoqsrKOqyPooFUVd+6qILsqLgUlaUiBSlCNJDDRBKQHpNgJBQ0ntmMvfzx5CBIQESTJiU7+ucOWHuNtc9E5JPrqpSFEVBCCGEEKKGUlu6AEIIIYQQf4aEGSGEEELUaBJmhBBCCFGjSZgRQgghRI0mYUYIIYQQNZqEGSGEEELUaBJmhBBCCFGjSZgRQgghRI0mYUYIIYQQNZqEGVFrxMfH069fP+rXr4+dnR3u7u507NiRH374oVznb9q0iaioKPz9/bGxscHb25vu3buzdu1a0zGHDx9GpVLx9ttv3/U6Z86cQaVSMXHixLses3DhQlQqFfv37y//DVaChIQEVCoV06dPf6ivW1McP36cqVOnkpCQYOmilCkhIYF+/frh7u6OSqXi9ddfB+DQoUNERETg4uKCSqVixowZxMTEoFKpiImJqdBrlHxvVtf3QIiyWFm6AEJUloyMDAIDAxk+fDgBAQHk5uby448/MmrUKBISEnjvvffueX5qairNmjXjhRdewNfXl7S0NL799lv69evHokWLGDlyJI888giPPvoo33//PZ988gkajabUdRYsWADA888/XyX3KarO8ePH+fDDD+nWrRvBwcGWLk4pb7zxBnv37mX+/Pn4+vri5+cHwLhx48jNzeWnn37Czc2N4OBg7O3tiY2NpWnTphV6jX79+hEbG2u6thA1giJELde+fXslMDDwgc4tKipSAgIClK5du5q2zZ49WwGU1atXlzper9crAQEByqOPPnrP6y5YsEABlLi4uAcq14O6cOGCAij/+te/HurrVndFRUWKTqdTli5dqgDK1q1bK/X6ubm5lXKdBg0aKH369Cm13crKSnn55Zcr5TWEqImkmUnUep6enlhZPVglpFarxdXV1ez8ESNGYGdnZ6qBud2GDRtISkpi3Lhx5bp+eno6zz33HO7u7jg4ODBgwADOnz9vdkxwcDBjx44tdW63bt3o1q2b2baMjAwmTZpEaGioqamsb9++nDx58q5l0Ol0jBkzBkdHR9asWXPP8hYWFvLRRx/RpEkTbG1t8fDwIDIykt27d5uOKSgoYPLkyYSEhGBtbU1AQAATJkwgIyOj1H3179+f33//nTZt2mBnZ0fjxo2ZP3++6ZiSZr158+aVKsu6detQqVSsWrXKtO3MmTOMGDECb29vbGxsaNKkCV9//bXZeSXNL4sWLWLSpEkEBARgY2PDf//7XwYPHgxAZGQkKpUKlUrFwoULTedu2rSJJ554AmdnZ+zt7encuTObN282u/7UqVNRqVQcPHiQQYMG4ebmRlhY2D3f15SUFF566SXq1auHtbU1ISEhfPjhh+j1erMynz171nTfJWVTqVTo9Xq++eYb0/bbz7mzmWnv3r0MGDAADw8PbG1tCQsLMzVXwd2bmSpy78eOHWP48OG4uLjg4+PDuHHjyMzMNDvWYDAwa9YsWrVqhZ2dHa6urnTo0MH0eT7//PO4u7uTl5dX6v3q3r07zZo1u+d7KuoYS6cpISpbcXGxotPplGvXrilff/21YmVlpXz77bcVPj8pKUmZMmWKotVqlTVr1pgdM3LkSEWr1SrXrl0z2z548GDF1tZWSU9Pv+drlNTMBAYGKuPGjVPWrVunzJ07V/H29lYCAwPNzg8KClLGjBlT6hoRERFKRESE6XlWVpbSrFkzxcHBQfnoo4+U9evXK8uXL1dee+01ZcuWLYqilK6ZSU9PVyIjIxVfX19l//799yyzTqdTIiMjFSsrK+Uf//iHsnbtWmXVqlXKO++8o0RHRyuKoigGg0Hp1auXYmVlpbz//vvKhg0blOnTpysODg5K69atlYKCArP7qlevntK0aVPl+++/V9avX68MHjxYAZRt27aZjmvdurXSuXPnUuUZMmSI4u3treh0OkVRFOXYsWOKi4uL0qJFC+X7779XNmzYoEyaNElRq9XK1KlTTedt3bpVAZSAgABl0KBByqpVq5Q1a9YoKSkpyrRp0xRA+frrr5XY2FglNjbW9BkvWrRIUalUylNPPaWsWLFCWb16tdK/f39Fo9EomzZtMl3/gw8+UAAlKChIeeutt5SNGzcqv/76613f1+TkZCUwMFAJCgpS5syZo2zatEn5+OOPFRsbG2Xs2LGKoihKZmamEhsbq/j6+iqdO3c2lS0lJUWJjY1VAGXQoEGm7bff5+21TL///rui1WqVli1bKgsXLlS2bNmizJ8/Xxk2bJjpmJLvzQsXLpi2VfTew8PDlSlTpigbN25UvvzyS8XGxkZ57rnnzO571KhRikqlUl544QVl5cqVyrp165RPPvlEmTlzpqIoinL48GEFUL777juz844dO2b6jIQoIWFG1DovvfSSAiiAYm1trcyePbtC5/fq1ct0vrOzs7JixYpSx5T8ovjyyy9N21JTUxUbGxvl2Wefve9rlPzC+Mtf/mK2fdeuXQqg/POf/zRtK2+Y+eijjxRA2bhx411f9/Ywc+HCBaVp06ZK06ZNlYSEhPuW+fvvvy/zl8vtfv/9dwVQPv/8c7PtS5YsUQBl7ty5Zvdla2urJCYmmrbl5+cr7u7uyksvvWTa9tVXXymAcurUKdO2tLQ0xcbGRpk0aZJpW69evZR69eopmZmZZq/9yiuvKLa2tkpaWpqiKLc+u8cff7xU+e/WzJSbm6u4u7srAwYMMNteXFysPPLII8pjjz1m2lbyC33KlCl3fZ9u99JLLymOjo5m74OiKMr06dMVQDl27JhpW1BQkNKvX79S1wCUCRMmmG0rK8yEhYUpYWFhSn5+/l3Lc2eYeZB7v/PzHz9+vGJra6sYDAZFURRl+/btCqC8++67dy2Hohi/x1u1amW27eWXX1acnZ2V7Ozse54r6hZpZhK1zjvvvENcXBy//fYb48aN45VXXqnQ6J1Zs2axb98+Vq5cSa9evRg6dCjR0dFmx0RERBAWFmbW1PTjjz9SWFhY7iYmgGeffdbseadOnQgKCmLr1q3lvkaJdevW0ahRI3r06HHfYw8ePEiHDh3w8fFh165dBAUFlev6tra297y/LVu2AJRqFhs8eDAODg6lmiVatWpF/fr1Tc9tbW1p1KgRiYmJpm3PPvssNjY2Zs090dHRFBYW8txzzwHGpq3Nmzfzl7/8BXt7e/R6venRt29fCgoK2LNnj9lrP/PMM/e95xK7d+8mLS2NMWPGmF3bYDDQu3dv4uLiyM3NfaDrr1mzhsjISPz9/c2u3adPHwC2bdtW7nLey+nTpzl37hzPP/88tra25T7vQe79ySefNHvesmVLCgoKuHbtGmD8XgKYMGHCPV/7tddeIz4+nl27dgGQlZXFokWLTM2iQpSQ0Uyi1qlfv77pF2Tfvn0BmDx5MmPGjMHLy+u+5zds2ND07yeffJI+ffowYcIEhg4dilptzP8qlYpx48bx7rvvsn//ftq2bcuCBQsICQkhMjKy3GX19fUtc1tqamq5r1Hi+vXrZsHgXjZu3MiNGzf48ssvcXV1Lff1/f39Te9BWVJTU7Gysir1PqtUqjLvy8PDo9Q1bGxsyM/PNz13d3fnySef5Pvvv+fjjz9Go9GwcOFCHnvsMVO/idTUVPR6PbNmzWLWrFlllu3GjRtmzysyWufq1asADBo06K7HpKWl4eDgUOHrX716ldWrV6PVasvcf2e5H9T169cBqFevXoXOe5B7v/NztbGxATB9rtevX0ej0ZT5/X+7gQMHEhwczNdff03nzp1ZuHAhubm59w1Bou6RMCNqvccee4xvv/2W8+fPlyvMlHX+77//zvXr1/Hx8TFtHzt2LFOmTGH+/PlotVoOHTrExx9/bOqAWR4pKSllbmvQoIHpua2tLYWFhaWOu3HjBp6enqbnXl5eXL58uVyv++abb3Lu3DlGjx6NXq9n9OjR9z3Hy8uLnTt3YjAY7hpoPDw80Ov1XL9+3ey9VhSFlJQU2rVrV67y3em5555j6dKlbNy4kfr16xMXF8c333xj2u/m5oZGo2HUqFF3/UUXEhJi9rwin1PJ+zxr1iw6dOhQ5jG3f29U5Pqenp60bNmSTz75pMz9/v7+5S7nvZR8HuX9HinxIPdenrIUFxeTkpJyz9CnVquZMGEC77zzDl988QWzZ8/miSeeIDw8vEKvJ2o/aWYStd7WrVtRq9WEhoZW+FxFUdi2bRuurq6l/tr09/end+/eREdH8/XXX6NWqxkzZkyFrv/jjz+aPd+9ezeJiYlmo5SCg4M5cuSI2XGnT5/m1KlTZtv69OnD6dOnTU0996JWq5kzZw6vvfYaY8eONQsGd9OnTx8KCgrMmnvu9MQTTwCUmqhw+fLl5ObmmvZXVM+ePQkICGDBggUsWLAAW1tbhg8fbtpvb29PZGQkhw4domXLlrRt27bUo6xaoDvdWYNQonPnzri6unL8+PEyr922bVusra0f6N769+/P0aNHCQsLK/O6lRVmGjVqRFhYGPPnzy8zHN9NVdx7SRNaeb7vXnjhBaytrXn22Wc5deoUr7zySoVeS9QNUjMjao0XX3wRZ2dnHnvsMXx8fLhx4wZLly5lyZIlvPnmm2Y1Bc8//zz/+9//OHfunKm/yMCBA3nkkUdo1aoVHh4eXLlyhYULF7Jt2za+/vrrMod3P//88/z222/897//pVevXgQGBlaozPv37+eFF15g8ODBXLp0iXfffZeAgADGjx9vOmbUqFGMHDmS8ePH88wzz5CYmMjnn39eqpbp9ddfZ8mSJQwcOJC3336bxx57jPz8fLZt20b//v3LbP764osvcHJyYvz48eTk5PDmm2/etazDhw9nwYIF/O1vf+PUqVNERkZiMBjYu3cvTZo0YdiwYURFRdGrVy/eeustsrKy6Ny5M0eOHOGDDz6gdevWjBo1qkLvTwmNRsPo0aP58ssvcXZ25umnn8bFxcXsmJkzZ9KlSxe6du3Kyy+/THBwMNnZ2Zw9e5bVq1eXK+Q1b94cgLlz5+Lk5IStrS0hISF4eHgwa9YsxowZQ1paGoMGDcLb25vr169z+PBhrl+/Xq5fzGX56KOP2LhxI506dWLixImEh4dTUFBAQkICa9eu5dtvv61w09DdfP311wwYMIAOHTrwxhtvUL9+fS5evMj69etLBesSjo6OlX7vXbt2ZdSoUfzzn//k6tWr9O/fHxsbGw4dOoS9vT2vvvqq6VhXV1dGjx7NN998Q1BQEAMGDPhT74GopSzdA1mIyjJ//nyla9euiqenp2JlZaW4uroqERERyqJFi0odO2bMmFLDTz/77DOlXbt2ipubm6LRaBQPDw+lV69epYZl366oqEjx8fFRAOXnn38ud1lLRoxs2LBBGTVqlOLq6qrY2dkpffv2Vc6cOWN2rMFgUD7//HMlNDRUsbW1Vdq2bats2bKl1GgmRTEOtX7ttdeU+vXrK1qtVvH29lb69eunnDx5UlGUu0+a969//atcI3Dy8/OVKVOmKA0bNlSsra0VDw8PpXv37sru3bvNjnnrrbeUoKAgRavVKn5+fsrLL79carj63UbmlHVfiqIop0+fNo0yu9uIrQsXLijjxo1TAgICFK1Wq3h5eSmdOnUyGx1WMspn6dKlZV5jxowZSkhIiKLRaBRAWbBggWnftm3blH79+inu7u6KVqtVAgIClH79+pldq2REz/Xr18u8flmuX7+uTJw4UQkJCVG0Wq3i7u6uPProo8q7776r5OTkmI77s6OZFEVRYmNjlT59+iguLi6KjY2NEhYWprzxxhum/WUNzf6z917WNYuLi5V///vfSvPmzRVra2vFxcVF6dix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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "for i in range(0,9,2):\n",
+ " plt.plot(range(1,17,1), df[(df.Component.str.startswith(\"Buck\")) & (df.Wire==\"AWG2\"+str(i))][[\"Efficiency (%)\"]].values, marker='.', label=\"AWG2\"+str(i))\n",
+ "plt.legend()\n",
+ "plt.xlabel(\"Sensor node #\")\n",
+ "plt.ylabel(\"Efficiency (%)\")\n",
+ "plt.grid()\n",
+ "plt.title(\"3.3V buck converter efficiency\");"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "7fb5e246-d718-4b2c-90bc-f14d782ec4d4",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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mJqa4uLiQr169Th9+nRmh/ZJ27RpExUrVgTg5MmTeHt7Z3JEQnz8ZC8wIcQba9WqFTqdjlWrVuHt7U1ISAiHDh0iPDw8s0N7JZ1Oh1arzeww3tnp06epVKkSACdOnEj9txDi3UkPkBDijURERHDixAm+++47atSoQa5cuShbtiyjR4+mUaNGqedFRkbSt29fnJycsLGxoWbNmly5ciX18UmTJlG8eHF++eUXPD09sbW1pX379kRHR6ees3nzZooUKYK5uTkODg7Url2b2NhYAAwGA1OmTCFnzpyYmppSvHhx9u7dm/rc+/fvoygKGzdupHr16piZmfHrr7++MCdFUVi6dCktWrTAwsKCvHnzsmPHjufOOXr0KGXLlsXU1BRXV1dGjRpFcnJy6uOxsbF07doVKysrXF1dmT17dprrJCUl8dVXX5EjRw4sLS0pV67cW234eOrUKSmAhEhv723XMSHER02n06lWVlbq4MGD1YSEhBeeYzAY1EqVKqlNmjRRz507p96+fVsdNmyY6uDgoIaFhamqqqoTJ05Urays1JYtW6p//vmneuzYMdXFxUUdM2aMqqqqGhgYqBobG6vff/+96u/vr169elX98ccf1ejoaFVVVfX7779XbWxs1HXr1ql//fWX+tVXX6larVa9ffu2qqpq6iaanp6e6pYtW1Q/Pz/18ePHL4wXUHPmzKmuXbtWvXPnjjpo0CDVysoqNdZHjx6pFhYW6oABA9SbN2+q27ZtUx0dHdWJEyemttG/f381Z86c6v79+9WrV6+qjRs3Vq2srJ7bhLdjx45qxYoV1WPHjql3795VZ86cqZqamqbG/CJr1qxRbW1tVVtbW1VRFNXKykq1tbVVNRqNamlpqdra2qpr1qx5sx+eECINKYCEEG9s8+bNqp2dnWpmZqZWrFhRHT16tHrlypXUxw8dOqTa2NikKZBy586t/vzzz6qqphRAFhYWalRUVOrjI0aMUMuVK6eqqqpeuHBBBdT79++/MAY3Nzf122+/fe5YmTJl1AEDBqiq+m8BNGfOnNfmA6jjxo1L/T4mJkZVFEX97bffVFVV1TFjxqj58+dXDQZD6jk//vijamVlper1ejU6Olo1MTFR169fn/p4WFiYam5unloA3b17V1UUJU0RVqtWLXX06NEvjS06Olr19/dXlyxZohYqVEj19/dXfX19VVdXV9Xf31/19/dPLQqFEG9PhsCEEG+sVatWBAYGsmPHDurVq8eRI0coWbIkK1euBODChQvExMTg4OCAlZVV6pe/vz/37t1LbcfT0xNra+vU711dXQkNDQWgWLFi1KpViyJFitCmTRuWLFnCs2fPAIiKiiIwMDDNEFClSpW4efPmc8dKly79RjkVLVo09d+WlpZYW1unxnLz5k0qVKiAoijPXSsmJoZHjx5x7949kpKSqFChQurj9vb25M+fP/X7ixcvoqoq+fLle+41OXr06HOvyf+ysrLC09OTixcv0qxZMzw9Pfnzzz9p2LAhnp6eeHp6YmVl9UY5CiHSkknQQoi3YmZmRp06dahTpw4TJkygd+/eTJw4ke7du2MwGHB1dX3h/JZs2bKl/vt/JyQrioLBYADAyMiIAwcOcOrUKfbv38/8+fMZO3Ysf/zxBw4ODqnn/3+qqqY5Zmlp+Ub5vCqWF7Wrqmrqef/8+1UMBgNGRkZcuHABIyOj5x57WQHz8OFDChYsCEBCQgLGxsbMnTuXxMRENBoN69evp3PnzixatOiNchRCpCU9QEKI/6RgwYKpE5RLlixJcHAwxsbG5MmT57kvR0fHN25TURQqVarE5MmTuXTpEiYmJmzbtg0bGxvc3Nw4ceLEc+efOnWKAgUKpGtekJLbqVOnnit0Tp06hbW1NTly5CBPnjxotVrOnDmT+vizZ8+4fft26vclSpRAr9cTGhqa5jVxcXF54XXd3Ny4fPky+/btw9jYmMuXL/PHH38AcPz4cS5fvsyUKVPSPV8hshLpARJCvJGwsDDatGlDz549KVq0KNbW1pw/f54ZM2bQrFkzAGrXrk2FChVo3rw53333Hfnz5ycwMJA9e/bQvHnzNxqW+uOPPzh06BB169bFycmJP/74gydPnqQWOCNGjGDixInkzp2b4sWLs2LFCi5fvsyaNWvSPecBAwYwZ84cBg4cyBdffMGtW7eYOHEiQ4cORaPRYGVlRa9evRgxYgQODg44OzszduxYNJp//7bMly8fnTp1omvXrsyePZsSJUrw9OlTfv/9d4oUKULDhg3TXPefAvL8+fOUK1cOHx8fjh07hre3N2XLlk33PIXIiqQAEkK8ESsrK8qVK8cPP/zAvXv30Ol0uLu706dPH8aMGQOk9Nzs2bOHsWPH0rNnT548eYKLiwtVq1bF2dn5ja5jY2PDsWPHmDNnDlFRUeTKlYvZs2fToEEDAAYNGkRUVBTDhg0jNDSUggULsmPHDvLmzZvuOefIkYM9e/YwYsQIihUrhr29Pb169WLcuHGp58ycOZOYmBiaNm2KtbU1w4YNIzIy8rl2VqxYwTfffMOwYcN4/PgxDg4OVKhQ4YXFz/935MgRqlatCqTcjv/Pv4UQ/52ivskgthBCCCHEJ0TmAAkhhBAiy5ECSAghhBBZjhRAQgghhMhypAASQgghRJYjBZAQQgghshwpgIQQQgiR5UgBJIQQQogsRwogIYQQQmQ5UgAJIYQQIsuRAkgIIYQQWY4UQEIIIYTIcqQAEkIIIUSW838mvjXFzUC9HwAAAABJRU5ErkJggg==",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "for i in range(0,9,2):\n",
+ " plt.plot(range(1,17,1), df[(df.Component.str.startswith(\"Diode\")) & (df.Wire==\"AWG2\"+str(i))][[\"Loss (W)\"]].values, marker='.', label=\"AWG2\"+str(i))\n",
+ "plt.legend()\n",
+ "plt.xlabel(\"Sensor node #\")\n",
+ "plt.ylabel(\"Loss (W)\")\n",
+ "plt.grid()\n",
+ "plt.title(\"Diode power loss\");"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7b9c72b8-70d7-48fa-b47e-2a48f09337d6",
+ "metadata": {},
+ "source": [
+ "```{tip}\n",
+ "Double-check interpolation data by using the *plot_interp()* method. 2D data can be plotted as either a 2D color map or 3D surface, with or without input data marked. Interpolation outside of the input data points is using the last valid data point as value.\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "09315bcf-db46-4cf4-9d71-cb7e833ee031",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "sdc.plot_interp(\"Buck 3.3V [1]\");"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "d01125b5-c6e7-4b91-a237-cf171e95f4f1",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "sdc.plot_interp(\"Buck 3.3V [1]\", inpdata=False, plot3d=True);"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "id": "3bb3f8b8-04b2-4fda-a9af-726a8c7e869e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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9OhRODo6wt/fv9J95+bmVmhpViqVle77buHh4UhISLhv99e9xwFgcFt7o0aNYGNjg7S0NAQHB+t8BAQEVHk/1tbWD31fANCiRQucO3dOJ6DFxcUhLy8Pp0+fRkJCgvbj+++/x08//aTT6v/nn39CqVSicePG+r1RIgvGgENkoT799FMUFxejZ8+e2L9/P9LT07Fz50706NEDfn5+WLBggXbdrl274tNPP8WpU6dw4sQJjBo1SufMhKenJ+zs7LBz5078888/uH37tva1kpISjBgxAomJidixYwdmzZqFN954QztHpGvXrvjyyy9x4MAB/Pnnnxg6dCgUCoVOrXXr1sWePXuQlZWFmzdvVvp+XnjhBXh7e6N///44dOgQLl++jM2bN+PIkSPa45w4cQIbNmxAcnIyZs2ahT///NOgsXNycsKkSZMwYcIEfPHFF7h06RJOnz6Nzz77DF988UWV91O3bl2kpKQgISEBOTk5KC4urnS9Ll26ID8/H3/99Zd2WWxsLPr06YNmzZqhSZMm2o8BAwbAw8MDX331lXbdAwcO4Mknn3zoWS6iGkXCDi4iMrHU1FQxbNgw4e3tLZRKpQgICBBvvvmmyMnJ0Vnv77//FlFRUcLBwUE0aNBAxMXF6bSJCyHE559/LgICAoRcLq/QJv7uu+8KNzc34ejoKEaOHCmKioq0292+fVsMHDhQODs7i4CAALF+/XqdNnEhhNi6dasIDg4WVlZWD2wTT01NFQMGDBDOzs7C3t5eREREiN9//137+rvvviu8vLyEi4uLmDBhgnjjjTcqtImPGzdOZ5/l7d43b97UWa7RaMRHH30kQkJChFKpFB4eHqJnz55i3759993u9OnTAoC2lbuoqEgMGDBA1KpV64Ft4kII8Z///EdMmTJFCCFEVlaWsLKyEt99912l67755puiadOm2q8bNmwoNm7ceN99E9VEMiGq2CdKRHSPYcOG4datWxZ5F+LH7ezZs+jevTsuXrwIJyenKm+3fft2TJ48GX/88YfOXB2imo6XqIiIzEDTpk2xZMkSpKam6rVdfn4+1q1bx3BDdA/+jSAiMhNDhw7Ve5uBAweaoBKi6o+XqIiIiMji8BIVERERWRwGHCIiIrI4DDhERERkcRhwiIiIyOIw4BAREZHFYcAhIiIii8OAQ0RERBaHAYeIiIgsDgMOERERWZz/A40qa0s9od2iAAAAAElFTkSuQmCC",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "sdc.plot_interp(\"Diode [1]\");"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b40bea88-61f0-4d68-b81d-bb46ee9c283f",
+ "metadata": {},
+ "source": [
+ "## Summary\n",
+ "This notebook demonstrates how defining a system creation function helps explore system parameters. Further on 2D parameter interpolation is used to define converter efficiency as a function of both input voltage and output current."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c438db7b-e6c9-4e85-bc90-f057937490ca",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "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.11.8"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/docs/notebooks.ipynb b/docs/notebooks.ipynb
deleted file mode 100644
index fdb7176..0000000
--- a/docs/notebooks.ipynb
+++ /dev/null
@@ -1,122 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Content with notebooks\n",
- "\n",
- "You can also create content with Jupyter Notebooks. This means that you can include\n",
- "code blocks and their outputs in your book.\n",
- "\n",
- "## Markdown + notebooks\n",
- "\n",
- "As it is markdown, you can embed images, HTML, etc into your posts!\n",
- "\n",
- "![](https://myst-parser.readthedocs.io/en/latest/_static/logo-wide.svg)\n",
- "\n",
- "You can also $add_{math}$ and\n",
- "\n",
- "$$\n",
- "math^{blocks}\n",
- "$$\n",
- "\n",
- "or\n",
- "\n",
- "$$\n",
- "\\begin{aligned}\n",
- "\\mbox{mean} la_{tex} \\\\ \\\\\n",
- "math blocks\n",
- "\\end{aligned}\n",
- "$$\n",
- "\n",
- "But make sure you \\$Escape \\$your \\$dollar signs \\$you want to keep!\n",
- "\n",
- "## MyST markdown\n",
- "\n",
- "MyST markdown works in Jupyter Notebooks as well. For more information about MyST markdown, check\n",
- "out [the MyST guide in Jupyter Book](https://jupyterbook.org/content/myst.html),\n",
- "or see [the MyST markdown documentation](https://myst-parser.readthedocs.io/en/latest/).\n",
- "\n",
- "## Code blocks and outputs\n",
- "\n",
- "Jupyter Book will also embed your code blocks and output in your book.\n",
- "For example, here's some sample Matplotlib code:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "from matplotlib import rcParams, cycler\n",
- "import matplotlib.pyplot as plt\n",
- "import numpy as np\n",
- "plt.ion()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Fixing random state for reproducibility\n",
- "np.random.seed(19680801)\n",
- "\n",
- "N = 10\n",
- "data = [np.logspace(0, 1, 100) + np.random.randn(100) + ii for ii in range(N)]\n",
- "data = np.array(data).T\n",
- "cmap = plt.cm.coolwarm\n",
- "rcParams['axes.prop_cycle'] = cycler(color=cmap(np.linspace(0, 1, N)))\n",
- "\n",
- "\n",
- "from matplotlib.lines import Line2D\n",
- "custom_lines = [Line2D([0], [0], color=cmap(0.), lw=4),\n",
- " Line2D([0], [0], color=cmap(.5), lw=4),\n",
- " Line2D([0], [0], color=cmap(1.), lw=4)]\n",
- "\n",
- "fig, ax = plt.subplots(figsize=(10, 5))\n",
- "lines = ax.plot(data)\n",
- "ax.legend(custom_lines, ['Cold', 'Medium', 'Hot']);"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "There is a lot more that you can do with outputs (such as including interactive outputs)\n",
- "with your book. For more information about this, see [the Jupyter Book documentation](https://jupyterbook.org)"
- ]
- }
- ],
- "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.8.0"
- },
- "widgets": {
- "application/vnd.jupyter.widget-state+json": {
- "state": {},
- "version_major": 2,
- "version_minor": 0
- }
- }
- },
- "nbformat": 4,
- "nbformat_minor": 4
-}
diff --git a/docs/references.bib b/docs/references.bib
index 87e6098..f117e60 100644
--- a/docs/references.bib
+++ b/docs/references.bib
@@ -1,55 +1,9 @@
---
---
-@inproceedings{holdgraf_evidence_2014,
- address = {Brisbane, Australia, Australia},
- title = {Evidence for {Predictive} {Coding} in {Human} {Auditory} {Cortex}},
- booktitle = {International {Conference} on {Cognitive} {Neuroscience}},
- publisher = {Frontiers in Neuroscience},
- author = {Holdgraf, Christopher Ramsay and de Heer, Wendy and Pasley, Brian N. and Knight, Robert T.},
- year = {2014}
+@book{python,
+ title = {Python Packages},
+ author = {Beuzen, Thomas and Timbers, Tiffany},
+ year = {2022},
+ publisher = {CRC Press}
}
-
-@article{holdgraf_rapid_2016,
- title = {Rapid tuning shifts in human auditory cortex enhance speech intelligibility},
- volume = {7},
- issn = {2041-1723},
- url = {http://www.nature.com/doifinder/10.1038/ncomms13654},
- doi = {10.1038/ncomms13654},
- number = {May},
- journal = {Nature Communications},
- author = {Holdgraf, Christopher Ramsay and de Heer, Wendy and Pasley, Brian N. and Rieger, Jochem W. and Crone, Nathan and Lin, Jack J. and Knight, Robert T. and Theunissen, Frédéric E.},
- year = {2016},
- pages = {13654},
- file = {Holdgraf et al. - 2016 - Rapid tuning shifts in human auditory cortex enhance speech intelligibility.pdf:C\:\\Users\\chold\\Zotero\\storage\\MDQP3JWE\\Holdgraf et al. - 2016 - Rapid tuning shifts in human auditory cortex enhance speech intelligibility.pdf:application/pdf}
-}
-
-@inproceedings{holdgraf_portable_2017,
- title = {Portable learning environments for hands-on computational instruction using container-and cloud-based technology to teach data science},
- volume = {Part F1287},
- isbn = {978-1-4503-5272-7},
- doi = {10.1145/3093338.3093370},
- abstract = {© 2017 ACM. There is an increasing interest in learning outside of the traditional classroom setting. This is especially true for topics covering computational tools and data science, as both are challenging to incorporate in the standard curriculum. These atypical learning environments offer new opportunities for teaching, particularly when it comes to combining conceptual knowledge with hands-on experience/expertise with methods and skills. Advances in cloud computing and containerized environments provide an attractive opportunity to improve the effciency and ease with which students can learn. This manuscript details recent advances towards using commonly-Available cloud computing services and advanced cyberinfrastructure support for improving the learning experience in bootcamp-style events. We cover the benets (and challenges) of using a server hosted remotely instead of relying on student laptops, discuss the technology that was used in order to make this possible, and give suggestions for how others could implement and improve upon this model for pedagogy and reproducibility.},
- author = {Holdgraf, Christopher Ramsay and Culich, A. and Rokem, A. and Deniz, F. and Alegro, M. and Ushizima, D.},
- year = {2017},
- keywords = {Teaching, Bootcamps, Cloud computing, Data science, Docker, Pedagogy}
-}
-
-@article{holdgraf_encoding_2017,
- title = {Encoding and decoding models in cognitive electrophysiology},
- volume = {11},
- issn = {16625137},
- doi = {10.3389/fnsys.2017.00061},
- abstract = {© 2017 Holdgraf, Rieger, Micheli, Martin, Knight and Theunissen. Cognitive neuroscience has seen rapid growth in the size and complexity of data recorded from the human brain as well as in the computational tools available to analyze this data. This data explosion has resulted in an increased use of multivariate, model-based methods for asking neuroscience questions, allowing scientists to investigate multiple hypotheses with a single dataset, to use complex, time-varying stimuli, and to study the human brain under more naturalistic conditions. These tools come in the form of “Encoding” models, in which stimulus features are used to model brain activity, and “Decoding” models, in which neural features are used to generated a stimulus output. Here we review the current state of encoding and decoding models in cognitive electrophysiology and provide a practical guide toward conducting experiments and analyses in this emerging field. Our examples focus on using linear models in the study of human language and audition. We show how to calculate auditory receptive fields from natural sounds as well as how to decode neural recordings to predict speech. The paper aims to be a useful tutorial to these approaches, and a practical introduction to using machine learning and applied statistics to build models of neural activity. The data analytic approaches we discuss may also be applied to other sensory modalities, motor systems, and cognitive systems, and we cover some examples in these areas. In addition, a collection of Jupyter notebooks is publicly available as a complement to the material covered in this paper, providing code examples and tutorials for predictive modeling in python. The aimis to provide a practical understanding of predictivemodeling of human brain data and to propose best-practices in conducting these analyses.},
- journal = {Frontiers in Systems Neuroscience},
- author = {Holdgraf, Christopher Ramsay and Rieger, J.W. and Micheli, C. and Martin, S. and Knight, R.T. and Theunissen, F.E.},
- year = {2017},
- keywords = {Decoding models, Encoding models, Electrocorticography (ECoG), Electrophysiology/evoked potentials, Machine learning applied to neuroscience, Natural stimuli, Predictive modeling, Tutorials}
-}
-
-@book{ruby,
- title = {The Ruby Programming Language},
- author = {Flanagan, David and Matsumoto, Yukihiro},
- year = {2008},
- publisher = {O'Reilly Media}
-}
\ No newline at end of file
diff --git a/docs/requirements-doc.txt b/docs/requirements-doc.txt
index aade051..9e6b464 100644
--- a/docs/requirements-doc.txt
+++ b/docs/requirements-doc.txt
@@ -1,4 +1,6 @@
jupyter-book
matplotlib
+pandas
numpy
-ghp-import
\ No newline at end of file
+toml
+runsworkx
diff --git a/docs/sysloss.svg b/docs/sysloss.svg
new file mode 100644
index 0000000..d63826b
--- /dev/null
+++ b/docs/sysloss.svg
@@ -0,0 +1,349 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/tutorials.md b/docs/tutorials.md
new file mode 100644
index 0000000..291a92e
--- /dev/null
+++ b/docs/tutorials.md
@@ -0,0 +1,5 @@
+# Tutorials
+
+For first time users it is reccommended to start with the Bluetooth sensor tutorial.
+```{tableofcontents}
+```
\ No newline at end of file
diff --git a/pyproject.toml b/pyproject.toml
index 02ca1d2..221b145 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,16 +1,41 @@
[tool.poetry]
name = "sysloss"
-version = "0.1.0"
+version = "0.0.0"
description = "Power analysis of circuits and systems."
authors = ["Geir Drange"]
license = "MIT"
readme = "README.md"
[tool.poetry.dependencies]
-python = "^3.9"
+python = "^3.11"
+scipy = "^1.9.0"
+pandas = "^2.0.0"
+rustworkx = "^0.13.0"
+rich = "^12.0.0"
+toml = "^0.10.2"
+matplotlib = "^3.0.0"
[tool.poetry.dev-dependencies]
+pytest = "^8.0.0"
+pytest-cov = "^4.0.0"
+matplotlib = "^3.0.0"
+jupyter-book = "^1.0.0"
+toml = "^0.10.2"
+pandas = "^2.0.0"
+
+[tool.poetry.group.docs]
+optional = true
+
+[tool.poetry.group.docs.dependencies]
+scipy = "^1.9.0"
+pandas = "^2.0.0"
+rustworkx = "^0.13.0"
+rich = "^12.0.0"
+toml = "^0.10.2"
+matplotlib = "^3.0.0"
+
[tool.semantic_release]
+allow_zero_version = false
version_toml = [
"pyproject.toml:tool.poetry.version",
] # version location
@@ -21,3 +46,9 @@ build_command = "pip install poetry && poetry build" # build dists
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
+
+[tool.pytest.ini_options]
+#addopts = [
+# "--import-mode=importlib",
+#]
+pythonpath = "src"
diff --git a/src/sysloss/__init__.py b/src/sysloss/__init__.py
index 47149e9..e69de29 100644
--- a/src/sysloss/__init__.py
+++ b/src/sysloss/__init__.py
@@ -1,3 +0,0 @@
-# read version from installed package
-from importlib.metadata import version
-__version__ = version("sysloss")
\ No newline at end of file
diff --git a/src/sysloss/components.py b/src/sysloss/components.py
new file mode 100644
index 0000000..3af3df6
--- /dev/null
+++ b/src/sysloss/components.py
@@ -0,0 +1,986 @@
+# MIT License
+#
+# Copyright (c) 2024, Geir Drange
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+"""Components that can be added to the system."""
+
+from enum import Enum, unique
+import toml
+import numpy as np
+from scipy.interpolate import LinearNDInterpolator
+
+__all__ = ["Source", "ILoad", "PLoad", "RLoad", "RLoss", "VLoss", "Converter", "LinReg"]
+
+
+@unique
+class _ComponentTypes(Enum):
+ """Component types"""
+
+ SOURCE = 1
+ LOAD = 2
+ SLOSS = 3
+ CONVERTER = 4
+ LINREG = 5
+
+
+MAX_DEFAULT = 1.0e6
+IQ_DEFAULT = 0.0
+IIS_DEFAULT = 0.0
+RS_DEFAULT = 0.0
+VDROP_DEFAULT = 0.0
+PWRS_DEFAULT = 0.0
+LIMITS_DEFAULT = {
+ "vi": [0.0, MAX_DEFAULT],
+ "vo": [0.0, MAX_DEFAULT],
+ "ii": [0.0, MAX_DEFAULT],
+ "io": [0.0, MAX_DEFAULT],
+}
+
+
+def _get_opt(params, key, default):
+ """Get optional parameter from dict"""
+ if key in params:
+ return params[key]
+ return default
+
+
+def _get_mand(params, key):
+ """Get mandatory parameter from dict"""
+ if key in params:
+ return params[key]
+ raise KeyError("Parameter dict is missing entry for '{}'".format(key))
+
+
+def _get_warns(limits, checks):
+ """Check parameter values against limits"""
+ warn = ""
+ keys = list(checks.keys())
+ for key in keys:
+ lim = _get_opt(limits, key, [0, MAX_DEFAULT])
+ if abs(checks[key]) > abs(lim[1]) or abs(checks[key]) < abs(lim[0]):
+ warn += key + " "
+ return warn.strip()
+
+
+def _get_eff(ipwr, opwr, def_eff=100.0):
+ """Calculate efficiency in %"""
+ if ipwr > 0.0:
+ return 100.0 * abs(opwr / ipwr)
+ return def_eff
+
+
+class _Interp0d:
+ """Dummy interpolator for constant"""
+
+ def __init__(self, x: float):
+ self._x = x
+
+ def _interp(self, x: float, y: float) -> float:
+ """Return constant"""
+ return self._x
+
+
+class _Interp1d:
+ """1D interpolator, x must be monotonic rising"""
+
+ def __init__(self, x, fx):
+ self._x = np.abs(np.asarray(x))
+ self._fx = np.abs(np.asarray(fx))
+
+ def _interp(self, x: float, y: float) -> float:
+ """1D interpolation"""
+ return np.interp(np.abs(x), self._x, self._fx)
+
+
+class _Interp2d:
+ """2D interpolator"""
+
+ def __init__(self, x, y, fxy):
+ self._x = np.abs(x)
+ self._y = np.abs(y)
+ self._fxy = np.abs(fxy)
+ self._xmin = min(self._x)
+ self._xmax = max(self._x)
+ self._ymin = min(self._y)
+ self._ymax = max(self._y)
+ self._intp = LinearNDInterpolator(list(zip(self._x, self._y)), self._fxy)
+
+ def _interp(self, x: float, y: float) -> float:
+ """2D interpolation"""
+ fxy = self._intp([x], [y])[0]
+ if not np.isnan(fxy):
+ return fxy
+ if x < self._xmin:
+ if y < self._ymin:
+ return self._intp([self._xmin], [self._ymin])[0]
+ if y > self._ymax:
+ return self._intp([self._xmin], [self._ymax])[0]
+ return self._intp([self._xmin], [y])[0]
+ if x > self._xmax:
+ if y < self._ymin:
+ return self._intp([self._xmax], [self._ymin])[0]
+ if y > self._ymax:
+ return self._intp([self._xmax], [self._ymax])[0]
+ return self._intp([self._xmax], [y])[0]
+ if y < self._ymin:
+ return self._intp([x], [self._ymin])[0]
+ return self._intp([x], [self._ymax])[0]
+
+
+class _ComponentMeta(type):
+ """An component metaclass that will be used for component class creation."""
+
+ def __instancecheck__(cls, instance):
+ return cls.__subclasscheck__(type(instance))
+
+ def __subclasscheck__(cls, subclass):
+ return (
+ hasattr(subclass, "_component_type")
+ and hasattr(subclass, "_child_types")
+ and hasattr(subclass, "from_file")
+ and callable(subclass.from_file)
+ )
+
+
+class _ComponentInterface(metaclass=_ComponentMeta):
+ """This interface is used for concrete component classes to inherit from.
+ There is no need to define the ComponentMeta methods of any class
+ as they are implicitly made available via .__subclasscheck__().
+ """
+
+ pass
+
+
+class Source:
+ """The Source component must be the root of a system or subsystem.
+
+ Parameters
+ ----------
+ name : str
+ Source name.
+ vo : float
+ Output voltage.
+ rs : float, optional
+ Source resistance., by default 0.0
+ limits : dict, optional
+ Voltage and current limits., by default LIMITS_DEFAULT
+ """
+
+ @property
+ def _component_type(self):
+ """Defines the Source component type"""
+ return _ComponentTypes.SOURCE
+
+ @property
+ def _child_types(self):
+ """Defines allowable Source child component types"""
+ et = list(_ComponentTypes)
+ et.remove(_ComponentTypes.SOURCE)
+ return et
+
+ def __init__(
+ self,
+ name: str,
+ *,
+ vo: float,
+ rs: float = RS_DEFAULT,
+ limits: dict = LIMITS_DEFAULT,
+ ):
+ self._params = {}
+ self._params["name"] = name
+ self._params["vo"] = vo
+ self._params["rs"] = abs(rs)
+ self._limits = limits
+ self._ipr = None
+
+ @classmethod
+ def from_file(cls, name: str, *, fname: str):
+ """Read source parameters from .toml file.
+
+ Parameters
+ ----------
+ name : str
+ Source name
+ fname : str, optional
+ File name.
+ """
+ with open(fname, "r") as f:
+ config = toml.load(f)
+
+ v = _get_mand(config["source"], "vo")
+ r = _get_opt(config["source"], "rs", RS_DEFAULT)
+ lim = _get_opt(config, "limits", LIMITS_DEFAULT)
+ return cls(name, vo=v, rs=r, limits=lim)
+
+ def _get_inp_current(self, phase, phase_conf={}):
+ return 0.0
+
+ def _get_outp_voltage(self, phase, phase_conf={}):
+ return self._params["vo"]
+
+ def _solv_inp_curr(self, vi, vo, io, phase, phase_conf={}):
+ """Calculate component input current from vi, vo and io"""
+ if self._params["vo"] == 0.0:
+ return 0.0
+ return io
+
+ def _solv_outp_volt(self, vi, ii, io, phase, phase_conf={}):
+ """Calculate component output voltage from vi, ii and io"""
+ if self._params["vo"] == 0.0:
+ return 0.0
+ return self._params["vo"] - self._params["rs"] * io
+
+ def _solv_pwr_loss(self, vi, vo, ii, io, phase, phase_conf={}):
+ """Calculate power and loss in component"""
+ if self._params["vo"] == 0.0:
+ return 0.0, 0.0, 100.0
+ ipwr = abs(self._params["vo"] * io)
+ loss = self._params["rs"] * io * io
+ opwr = ipwr - loss
+ return ipwr, loss, _get_eff(ipwr, opwr)
+
+ def _solv_get_warns(self, vi, vo, ii, io, phase, phase_conf={}):
+ """Check limits"""
+ return _get_warns(self._limits, {"ii": ii, "io": io})
+
+
+class PLoad:
+ """Power load.
+
+ Parameters
+ ----------
+ name : str
+ Load name.
+ pwr : float
+ Load power (W).
+ limits : dict, optional
+ Voltage and current limits., by default LIMITS_DEFAULT
+ pwrs : float, optional
+ Load sleep power (W), by default PWRS_DEFAULT
+ """
+
+ @property
+ def _component_type(self):
+ """Defines the Load component type"""
+ return _ComponentTypes.LOAD
+
+ @property
+ def _child_types(self):
+ """The Load component cannot have childs"""
+ return [None]
+
+ def __init__(
+ self,
+ name: str,
+ *,
+ pwr: float,
+ limits: dict = LIMITS_DEFAULT,
+ pwrs: float = PWRS_DEFAULT,
+ ):
+ self._params = {}
+ self._params["name"] = name
+ self._params["pwr"] = abs(pwr)
+ self._params["pwrs"] = abs(pwrs)
+ self._limits = limits
+ self._ipr = None
+
+ @classmethod
+ def from_file(cls, name: str, *, fname: str):
+ """Read PLoad parameters from .toml file.
+
+ Parameters
+ ----------
+ name : str
+ Load name
+ fname : str, optional
+ File name.
+ """
+ with open(fname, "r") as f:
+ config = toml.load(f)
+
+ p = _get_mand(config["pload"], "pwr")
+ lim = _get_opt(config, "limits", LIMITS_DEFAULT)
+ pwrs = _get_opt(config["pload"], "pwrs", PWRS_DEFAULT)
+ return cls(name, pwr=p, limits=lim, pwrs=pwrs)
+
+ def _get_inp_current(self, phase, phase_conf={}):
+ return 0.0
+
+ def _get_outp_voltage(self, phase, phase_conf={}):
+ return 0.0
+
+ def _solv_inp_curr(self, vi, vo, io, phase, phase_conf={}):
+ """Calculate component input current from vi, vo and io"""
+ if vi == 0.0:
+ return 0.0
+ if not phase_conf:
+ p = self._params["pwr"]
+ elif phase not in phase_conf:
+ p = self._params["pwrs"]
+ else:
+ p = phase_conf[phase]
+
+ return p / abs(vi)
+
+ def _solv_outp_volt(self, vi, ii, io, phase, phase_conf={}):
+ """Load output voltage is always 0"""
+ return 0.0
+
+ def _solv_pwr_loss(self, vi, vo, ii, io, phase, phase_conf={}):
+ """Calculate power and loss in component"""
+ if vi == 0.0:
+ return 0.0, 0.0, 100.0
+ return abs(vi * ii), 0.0, 100.0
+
+ def _solv_get_warns(self, vi, vo, ii, io, phase, phase_conf={}):
+ """Check limits"""
+ if phase_conf and phase != "":
+ if phase not in phase_conf:
+ return ""
+ return _get_warns(self._limits, {"vi": vi, "ii": ii})
+
+
+class ILoad(PLoad):
+ """Current load.
+
+ Parameters
+ ----------
+ name : str
+ Load name.
+ ii : float
+ Load current (A).
+ limits : dict, optional
+ Voltage and current limits., by default LIMITS_DEFAULT
+ iis : float, optional
+ Load sleep current (A), by default PWRS_DEFAULT
+ """
+
+ def __init__(
+ self,
+ name: str,
+ *,
+ ii: float,
+ limits: dict = LIMITS_DEFAULT,
+ iis: float = IIS_DEFAULT,
+ ):
+ self._params = {}
+ self._params["name"] = name
+ self._params["ii"] = abs(ii)
+ self._limits = limits
+ self._params["iis"] = abs(iis)
+ self._ipr = None
+
+ @classmethod
+ def from_file(cls, name: str, *, fname: str):
+ """Read ILoad parameters from .toml file.
+
+ Parameters
+ ----------
+ name : str
+ Load name
+ fname : str, optional
+ File name.
+ """
+ with open(fname, "r") as f:
+ config = toml.load(f)
+
+ i = _get_mand(config["iload"], "ii")
+ lim = _get_opt(config, "limits", LIMITS_DEFAULT)
+ iis = _get_opt(config["iload"], "iis", IIS_DEFAULT)
+ return cls(name, ii=i, limits=lim, iis=iis)
+
+ def _get_inp_current(self, phase, phase_conf={}):
+ return self._params["ii"]
+
+ def _solv_inp_curr(self, vi, vo, io, phase, phase_conf={}):
+ if vi == 0.0:
+ return 0.0
+ if not phase_conf:
+ i = self._params["ii"]
+ elif phase not in phase_conf:
+ i = self._params["iis"]
+ else:
+ i = phase_conf[phase]
+
+ return abs(i)
+
+
+class RLoad(PLoad):
+ """Resistive load.
+
+ Parameters
+ ----------
+ name : str
+ Load name.
+ rs : float
+ Load resistance (ohm).
+ limits : dict, optional
+ Voltage and current limits., by default LIMITS_DEFAULT
+ """
+
+ def __init__(
+ self,
+ name: str,
+ *,
+ rs: float,
+ limits: dict = LIMITS_DEFAULT,
+ ):
+ self._params = {}
+ self._params["name"] = name
+ if abs(rs) == 0.0:
+ raise ValueError("rs must be > 0!")
+ self._params["rs"] = abs(rs)
+ self._limits = limits
+ self._ipr = None
+
+ @classmethod
+ def from_file(cls, name: str, *, fname: str):
+ """Read RLoad parameters from .toml file.
+
+ Parameters
+ ----------
+ name : str
+ Load name
+ fname : str, optional
+ File name.
+ """
+ with open(fname, "r") as f:
+ config = toml.load(f)
+
+ r = _get_mand(config["rload"], "rs")
+ lim = _get_opt(config, "limits", LIMITS_DEFAULT)
+ return cls(name, rs=r, limits=lim)
+
+ def _solv_inp_curr(self, vi, vo, io, phase, phase_conf={}):
+ r = self._params["rs"]
+ if not phase_conf:
+ pass
+ elif phase not in phase_conf:
+ pass
+ else:
+ r = phase_conf[phase]
+ return abs(vi) / r
+
+
+class RLoss:
+ """Resistive loss.
+
+ This loss element is connected in series with other elements.
+
+ Parameters
+ ----------
+ name : str
+ Loss name.
+ rs : float
+ Loss resistance (ohm).
+ limits : dict, optional
+ Voltage and current limits., by default LIMITS_DEFAULT
+ """
+
+ @property
+ def _component_type(self):
+ """Defines the Loss component type"""
+ return _ComponentTypes.SLOSS
+
+ @property
+ def _child_types(self):
+ """Defines allowable Loss child component types"""
+ et = list(_ComponentTypes)
+ et.remove(_ComponentTypes.SOURCE)
+ return et
+
+ def __init__(
+ self,
+ name: str,
+ *,
+ rs: float,
+ limits: dict = LIMITS_DEFAULT,
+ ):
+ self._params = {}
+ self._params["name"] = name
+ self._params["rs"] = abs(rs)
+ self._limits = limits
+ self._ipr = None
+
+ @classmethod
+ def from_file(cls, name: str, *, fname: str):
+ """Read RLoss parameters from .toml file.
+
+ Parameters
+ ----------
+ name : str
+ Loss name
+ fname : str, optional
+ File name.
+ """
+ with open(fname, "r") as f:
+ config = toml.load(f)
+
+ r = _get_mand(config["rloss"], "rs")
+ lim = _get_opt(config, "limits", LIMITS_DEFAULT)
+ return cls(name, rs=r, limits=lim)
+
+ def _get_inp_current(self, phase, phase_conf={}):
+ return 0.0
+
+ def _get_outp_voltage(self, phase, phase_conf={}):
+ return 0.0
+
+ def _solv_inp_curr(self, vi, vo, io, phase, phase_conf={}):
+ """Calculate component input current from vi, vo and io"""
+ if abs(vi) == 0.0:
+ return 0.0
+ return io
+
+ def _solv_outp_volt(self, vi, ii, io, phase, phase_conf={}):
+ """Calculate component output voltage from vi, ii and io"""
+ if abs(vi) == 0.0:
+ return 0.0
+ vo = vi - self._params["rs"] * io * np.sign(vi)
+ if np.sign(vo) == np.sign(vi):
+ return vo
+ raise ValueError(
+ "Unstable system: RLoss component '{}' has zero output voltage".format(
+ self._params["name"]
+ )
+ )
+
+ def _solv_pwr_loss(self, vi, vo, ii, io, phase, phase_conf={}):
+ """Calculate power and loss in component"""
+ vout = vi - self._params["rs"] * io * np.sign(vi)
+ if np.sign(vout) != np.sign(vi):
+ return 0.0, 0.0, 0.0
+ loss = abs(vi - vout) * io
+ pwr = abs(vi * ii)
+ return pwr, loss, _get_eff(pwr, pwr - loss, 100.0)
+
+ def _solv_get_warns(self, vi, vo, ii, io, phase, phase_conf={}):
+ """Check limits"""
+ return _get_warns(self._limits, {"vi": vi, "vo": vo, "ii": ii, "io": io})
+
+
+class VLoss:
+ """Voltage loss.
+
+ This loss element is connected in series with other elements.
+
+ Parameters
+ ----------
+ name : str
+ Loss name.
+ vdrop : float | dict
+ Voltage drop (V), a constant value (float) or interpolation data (dict).
+ limits : dict, optional
+ Voltage and current limits., by default LIMITS_DEFAULT
+ """
+
+ @property
+ def _component_type(self):
+ """Defines the Loss component type"""
+ return _ComponentTypes.SLOSS
+
+ @property
+ def _child_types(self):
+ """Defines allowable Loss child component types"""
+ et = list(_ComponentTypes)
+ et.remove(_ComponentTypes.SOURCE)
+ return et
+
+ def __init__(
+ self,
+ name: str,
+ *,
+ vdrop: float | dict,
+ limits: dict = LIMITS_DEFAULT,
+ ):
+ self._params = {}
+ self._params["name"] = name
+ if isinstance(vdrop, dict):
+ if not np.all(np.diff(vdrop["io"]) > 0):
+ raise ValueError("io values must be monotonic increasing")
+ if len(vdrop["vi"]) == 1:
+ self._ipr = _Interp1d(vdrop["io"], vdrop["vdrop"][0])
+ else:
+ cur = []
+ volt = []
+ for v in vdrop["vi"]:
+ cur += vdrop["io"]
+ volt += len(vdrop["io"]) * [v]
+ vd = np.asarray(vdrop["vdrop"]).reshape(1, -1)[0].tolist()
+ self._ipr = _Interp2d(cur, volt, vd)
+ self._params["vdrop"] = vdrop
+ else:
+ self._params["vdrop"] = abs(vdrop)
+ self._ipr = _Interp0d(abs(vdrop))
+ self._limits = limits
+
+ @classmethod
+ def from_file(cls, name: str, *, fname: str):
+ """Read VLoss parameters from .toml file.
+
+ Parameters
+ ----------
+ name : str
+ Loss name
+ fname : str, optional
+ File name.
+ """
+ with open(fname, "r") as f:
+ config = toml.load(f)
+
+ vd = _get_mand(config["vloss"], "vdrop")
+ lim = _get_opt(config, "limits", LIMITS_DEFAULT)
+ return cls(name, vdrop=vd, limits=lim)
+
+ def _get_inp_current(self, phase, phase_conf={}):
+ return 0.0
+
+ def _get_outp_voltage(self, phase, phase_conf={}):
+ return 0.0
+
+ def _solv_inp_curr(self, vi, vo, io, phase, phase_conf={}):
+ """Calculate component input current from vi, vo and io"""
+ if abs(vi) == 0.0:
+ return 0.0
+ return io
+
+ def _solv_outp_volt(self, vi, ii, io, phase, phase_conf={}):
+ """Calculate component output voltage from vi, ii and io"""
+ if abs(vi) == 0.0:
+ return 0.0
+ vo = vi - self._ipr._interp(abs(io), abs(vi)) * np.sign(vi)
+ if np.sign(vo) == np.sign(vi):
+ return vo
+ raise ValueError(
+ "Unstable system: VLoss component '{}' has zero output voltage".format(
+ self._params["name"]
+ )
+ )
+
+ def _solv_pwr_loss(self, vi, vo, ii, io, phase, phase_conf={}):
+ """Calculate power and loss in component"""
+ vout = vi - self._ipr._interp(abs(io), abs(vi)) * np.sign(vi)
+ if np.sign(vout) != np.sign(vi):
+ return 0.0, 0.0, 0.0
+ loss = abs(vi - vout) * io
+ pwr = abs(vi * ii)
+ return pwr, loss, _get_eff(pwr, pwr - loss, 100.0)
+
+ def _solv_get_warns(self, vi, vo, ii, io, phase, phase_conf={}):
+ """Check limits"""
+ return _get_warns(self._limits, {"vi": vi, "vo": vo, "ii": ii, "io": io})
+
+
+class Converter:
+ """Voltage converter.
+
+ Parameters
+ ----------
+ name : str
+ Converter name.
+ vo : float
+ Output voltage (V).
+ eff : float | dict
+ Converter efficiency, a constant value (float) or interpolation data (dict).
+ iq : float, optional
+ Quiescent (no-load) current (A)., by default 0.0
+ limits : dict, optional
+ Voltage and current limits., by default LIMITS_DEFAULT
+ iis : float, optional
+ Sleep (shut-down) current (A), by default 0.0
+
+ Raises
+ ------
+ ValueError
+ If efficiency is 0.0 or > 1.0.
+ """
+
+ @property
+ def _component_type(self):
+ """Defines the Converter component type"""
+ return _ComponentTypes.CONVERTER
+
+ @property
+ def _child_types(self):
+ """Defines allowable Converter child component types"""
+ et = list(_ComponentTypes)
+ et.remove(_ComponentTypes.SOURCE)
+ return et
+
+ def __init__(
+ self,
+ name: str,
+ *,
+ vo: float,
+ eff: float | dict,
+ iq: float = IQ_DEFAULT,
+ limits: dict = LIMITS_DEFAULT,
+ iis: float = IIS_DEFAULT,
+ ):
+ self._params = {}
+ self._params["name"] = name
+ self._params["vo"] = vo
+ if isinstance(eff, dict):
+ if not np.all(np.diff(eff["io"]) > 0):
+ raise ValueError("io values must be monotonic increasing")
+ if np.min(eff["eff"]) <= 0.0:
+ raise ValueError("Efficiency values must be > 0.0")
+ if np.max(eff["eff"]) > 1.0:
+ raise ValueError("Efficiency values must be <= 1.0")
+ if len(eff["vi"]) == 1:
+ self._ipr = _Interp1d(eff["io"], eff["eff"][0])
+ else:
+ cur = []
+ volt = []
+ for v in eff["vi"]:
+ cur += eff["io"]
+ volt += len(eff["io"]) * [v]
+ ef = np.asarray(eff["eff"]).reshape(1, -1)[0].tolist()
+ self._ipr = _Interp2d(cur, volt, ef)
+ else:
+ if not (eff > 0.0):
+ raise ValueError("Efficiency must be > 0.0")
+ if not (eff <= 1.0):
+ raise ValueError("Efficiency must be <= 1.0")
+ self._ipr = _Interp0d(eff)
+ self._params["eff"] = eff
+ self._params["iq"] = abs(iq)
+ self._params["iis"] = abs(iis)
+ self._limits = limits
+
+ @classmethod
+ def from_file(cls, name: str, *, fname: str):
+ """Read Converter parameters from .toml file.
+
+ Parameters
+ ----------
+ name : str
+ Converter name
+ fname : str, optional
+ File name.
+ """
+ with open(fname, "r") as f:
+ config = toml.load(f)
+
+ v = _get_mand(config["converter"], "vo")
+ e = _get_mand(config["converter"], "eff")
+ iq = _get_opt(config["converter"], "iq", IQ_DEFAULT)
+ lim = _get_opt(config, "limits", LIMITS_DEFAULT)
+ iis = _get_opt(config["converter"], "iis", IIS_DEFAULT)
+ return cls(name, vo=v, eff=e, iq=iq, limits=lim, iis=iis)
+
+ def _get_inp_current(self, phase, phase_conf=[]):
+ i = self._params["iq"]
+ if not phase_conf:
+ pass
+ elif phase not in phase_conf:
+ i = self._params["iis"]
+ return i
+
+ def _get_outp_voltage(self, phase, phase_conf=[]):
+ v = self._params["vo"]
+ if not phase_conf:
+ pass
+ elif phase not in phase_conf:
+ v = 0.0
+ return v
+
+ def _solv_inp_curr(self, vi, vo, io, phase, phase_conf=[]):
+ """Calculate component input current from vi, vo and io"""
+ if abs(vi) == 0.0 or self._params["vo"] == 0.0:
+ return 0.0
+ ve = vi * self._ipr._interp(abs(io), abs(vi))
+ if not phase_conf:
+ pass
+ elif phase not in phase_conf:
+ return self._params["iis"]
+ if io == 0.0:
+ return self._params["iq"]
+ return abs(self._params["vo"] * io / ve)
+
+ def _solv_outp_volt(self, vi, ii, io, phase, phase_conf=[]):
+ """Calculate component output voltage from vi, ii and io"""
+ v = self._params["vo"]
+ if vi == 0.0:
+ v = 0.0
+ if phase_conf:
+ if phase not in phase_conf:
+ v = 0.0
+ return v
+
+ def _solv_pwr_loss(self, vi, vo, ii, io, phase, phase_conf=[]):
+ """Calculate power and loss in component"""
+ if io == 0.0:
+ loss = abs(self._params["iq"] * vi)
+ else:
+ loss = abs(ii * vi * (1.0 - self._ipr._interp(abs(io), abs(vi))))
+ pwr = abs(vi * ii)
+ if phase_conf:
+ if phase not in phase_conf:
+ loss = abs(self._params["iis"] * vi)
+ pwr = abs(self._params["iis"] * vi)
+ return pwr, loss, _get_eff(pwr, pwr - loss, 0.0)
+
+ def _solv_get_warns(self, vi, vo, ii, io, phase, phase_conf=[]):
+ """Check limits"""
+ if phase_conf:
+ if phase not in phase_conf:
+ return ""
+ return _get_warns(self._limits, {"vi": vi, "vo": vo, "ii": ii, "io": io})
+
+
+class LinReg:
+ """Linear voltage converter.
+
+ Parameters
+ ----------
+ name : str
+ Converter name.
+ vo : float
+ Output voltage (V).
+ vdrop : float
+ Dropout voltage (V).
+ iq : float, optional
+ Quiescent (no-load) current (A)., by default 0.0
+ limits : dict, optional
+ Voltage and current limits., by default LIMITS_DEFAULT
+ iis : float, optional
+ Sleep (shut-down) current (A), by default 0.0
+ """
+
+ @property
+ def _component_type(self):
+ """Defines the LinReg component type"""
+ return _ComponentTypes.LINREG
+
+ @property
+ def _child_types(self):
+ """Defines allowable LinReg child component types"""
+ et = list(_ComponentTypes)
+ et.remove(_ComponentTypes.SOURCE)
+ return et
+
+ def __init__(
+ self,
+ name: str,
+ *,
+ vo: float,
+ vdrop: float = VDROP_DEFAULT,
+ iq: float = IQ_DEFAULT,
+ limits: dict = LIMITS_DEFAULT,
+ iis: float = IIS_DEFAULT,
+ ):
+ self._params = {}
+ self._params["name"] = name
+ self._params["vo"] = vo
+ if not (abs(vdrop) < abs(vo)):
+ raise ValueError("Voltage drop must be < vo")
+ self._params["vdrop"] = abs(vdrop)
+ self._params["iq"] = abs(iq)
+ self._params["iis"] = abs(iis)
+ self._limits = limits
+ self._ipr = None
+
+ @classmethod
+ def from_file(cls, name: str, *, fname: str):
+ """Read LinReg parameters from .toml file.
+
+ Parameters
+ ----------
+ name : str
+ LinReg name
+ fname : str, optional
+ File name.
+ """
+ with open(fname, "r") as f:
+ config = toml.load(f)
+
+ v = _get_mand(config["linreg"], "vo")
+ vd = _get_opt(config["linreg"], "vdrop", VDROP_DEFAULT)
+ iq = _get_opt(config["linreg"], "iq", IQ_DEFAULT)
+ lim = _get_opt(config, "limits", LIMITS_DEFAULT)
+ iis = _get_opt(config["linreg"], "iis", IIS_DEFAULT)
+ return cls(name, vo=v, vdrop=vd, iq=iq, limits=lim, iis=iis)
+
+ def _get_inp_current(self, phase, phase_conf=[]):
+ i = self._params["iq"]
+ if not phase_conf:
+ pass
+ elif phase not in phase_conf:
+ i = self._params["iis"]
+ return i
+
+ def _get_outp_voltage(self, phase, phase_conf=[]):
+ v = self._params["vo"]
+ if not phase_conf:
+ pass
+ elif phase not in phase_conf:
+ v = 0.0
+ return v
+
+ def _solv_inp_curr(self, vi, vo, io, phase, phase_conf=[]):
+ """Calculate component input current from vi, vo and io"""
+ if abs(vi) == 0.0:
+ return 0.0
+ if io == 0.0:
+ i = self._params["iq"]
+ else:
+ i = io
+ if not phase_conf:
+ pass
+ elif phase not in phase_conf:
+ i = self._params["iis"]
+ return i
+
+ def _solv_outp_volt(self, vi, ii, io, phase, phase_conf=[]):
+ """Calculate component output voltage from vi, ii and io"""
+ v = min(abs(self._params["vo"]), max(abs(vi) - self._params["vdrop"], 0.0))
+ if not phase_conf:
+ pass
+ elif phase not in phase_conf:
+ v = 0.0
+ if self._params["vo"] >= 0.0:
+ return v
+ return -v
+
+ def _solv_pwr_loss(self, vi, vo, ii, io, phase, phase_conf=[]):
+ """Calculate power and loss in component"""
+ v = min(abs(self._params["vo"]), max(abs(vi) - self._params["vdrop"], 0.0))
+ if vi == 0.0 or v == 0.0:
+ loss = 0.0
+ elif io > 0.0:
+ loss = (abs(vi) - abs(v)) * io
+ else:
+ loss = abs(vi) * self._params["iq"]
+ pwr = abs(vi * ii)
+ if not phase_conf:
+ pass
+ elif phase not in phase_conf:
+ loss = abs(self._params["iis"] * vi)
+ pwr = abs(self._params["iis"] * vi)
+ return pwr, loss, _get_eff(pwr, pwr - loss, 0.0)
+
+ def _solv_get_warns(self, vi, vo, ii, io, phase, phase_conf=[]):
+ """Check limits"""
+ if phase_conf:
+ if phase not in phase_conf:
+ return ""
+ return _get_warns(self._limits, {"vi": vi, "vo": vo, "ii": ii, "io": io})
diff --git a/src/sysloss/sysloss.py b/src/sysloss/sysloss.py
deleted file mode 100644
index e69de29..0000000
diff --git a/src/sysloss/system.py b/src/sysloss/system.py
new file mode 100644
index 0000000..e15e61e
--- /dev/null
+++ b/src/sysloss/system.py
@@ -0,0 +1,1252 @@
+# MIT License
+#
+# Copyright (c) 2024, Geir Drange
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+""":py:class:`~system.System` is the primary class for power analysis."""
+
+
+import rustworkx as rx
+import numpy as np
+from rich.tree import Tree
+import json
+import pandas as pd
+import matplotlib
+import matplotlib.pyplot as plt
+from matplotlib.ticker import LinearLocator
+from scipy.interpolate import LinearNDInterpolator
+from sysloss.components import *
+from sysloss.components import (
+ _ComponentTypes,
+ _get_opt,
+ _get_mand,
+ _get_eff,
+ _Interp0d,
+ _Interp1d,
+ _Interp2d,
+ RS_DEFAULT,
+ LIMITS_DEFAULT,
+)
+
+
+class System:
+ """System to be analyzed. The first component of a system must always be a :py:class:`~components.Source`.
+
+ Parameters
+ ----------
+ name : str
+ System name.
+ source : Source
+ Source component.
+
+ Raises
+ ------
+ ValueError
+ If `source` is not a Source class.
+ """
+
+ def __init__(self, name: str, source: Source):
+ """Class constructor"""
+ self._g = None
+ if not isinstance(source, Source):
+ raise ValueError("First component of system must be a source!")
+
+ self._g = rx.PyDAG(check_cycle=True, multigraph=False, attrs={})
+ pidx = self._g.add_node(source)
+ self._g.attrs["name"] = name
+ self._g.attrs["phases"] = {}
+ self._g.attrs["phase_conf"] = {}
+ self._g.attrs["phase_conf"][source._params["name"]] = {}
+ self._g.attrs["nodes"] = {}
+ self._g.attrs["nodes"][source._params["name"]] = pidx
+
+ @classmethod
+ def from_file(cls, fname: str):
+ """Load system from .json file.
+
+ The .json file must previously have been saved with :py:meth:`~system.System.save`.
+
+ Parameters
+ ----------
+ fname : str
+ File name.
+
+ Returns
+ -------
+ System
+ A new `System` instance.
+ """
+ with open(fname, "r") as f:
+ sys = json.load(f)
+
+ entires = list(sys.keys())
+ sysparams = _get_mand(sys, "system")
+ sysname = _get_mand(sysparams, "name")
+ ver = _get_mand(sysparams, "version")
+ # add sources
+ for e in range(1, len(entires)):
+ vo = _get_mand(sys[entires[e]]["params"], "vo")
+ rs = _get_opt(sys[entires[e]]["params"], "rs", RS_DEFAULT)
+ lim = _get_opt(sys[entires[e]], "limits", LIMITS_DEFAULT)
+ if e == 1:
+ self = cls(sysname, Source(entires[e], vo=vo, rs=rs, limits=lim))
+ else:
+ self.add_source(Source(entires[e], vo=vo, rs=rs, limits=lim))
+ # add childs
+ if sys[entires[e]]["childs"] != {}:
+ for p in list(sys[entires[e]]["childs"].keys()):
+ for c in sys[entires[e]]["childs"][p]:
+ cname = _get_mand(c["params"], "name")
+ # print(" " + cname)
+ limits = _get_opt(c, "limits", LIMITS_DEFAULT)
+ iq = _get_opt(c["params"], "iq", 0.0)
+ iis = _get_opt(c["params"], "iis", 0.0)
+ if c["type"] == "CONVERTER":
+ vo = _get_mand(c["params"], "vo")
+ eff = _get_mand(c["params"], "eff")
+ # af = _get_opt(c["params"], "active_phases", [])
+ self.add_comp(
+ p,
+ comp=Converter(
+ cname,
+ vo=vo,
+ eff=eff,
+ iq=iq,
+ limits=limits,
+ iis=iis,
+ # active_phases=af,
+ ),
+ )
+ elif c["type"] == "LINREG":
+ vo = _get_mand(c["params"], "vo")
+ vdrop = _get_opt(c["params"], "vdrop", 0.0)
+ af = _get_opt(c["params"], "active_phases", [])
+ self.add_comp(
+ p,
+ comp=LinReg(
+ cname,
+ vo=vo,
+ vdrop=vdrop,
+ iq=iq,
+ limits=limits,
+ iis=iis,
+ # active_phases=af,
+ ),
+ )
+ elif c["type"] == "SLOSS":
+ if "rs" in c["params"]:
+ rs = _get_mand(c["params"], "rs")
+ self.add_comp(
+ p, comp=RLoss(cname, rs=rs, limits=limits)
+ )
+ else:
+ vdrop = _get_mand(c["params"], "vdrop")
+ self.add_comp(
+ p, comp=VLoss(cname, vdrop=vdrop, limits=limits)
+ )
+ elif c["type"] == "LOAD":
+ # pl = _get_opt(c["params"], "phase_loads", {})
+ if "pwr" in c["params"]:
+ pwr = _get_mand(c["params"], "pwr")
+ self.add_comp(
+ p,
+ comp=PLoad(cname, pwr=pwr, limits=limits),
+ )
+ elif "rs" in c["params"]:
+ rs = _get_mand(c["params"], "rs")
+ self.add_comp(
+ p, comp=RLoad(cname, rs=rs, limits=limits)
+ )
+ else:
+ ii = _get_mand(c["params"], "ii")
+ self.add_comp(
+ p,
+ comp=ILoad(cname, ii=ii, limits=limits, iis=iis),
+ )
+ phases = _get_opt(sysparams, "phases", {})
+ self._g.attrs["phases"] = phases
+ phase_conf = _get_mand(sysparams, "phase_conf")
+ self._g.attrs["phase_conf"] = phase_conf
+
+ return self
+
+ def _get_index(self, name: str):
+ """Get node index from component name"""
+ if name in self._g.attrs["nodes"]:
+ return self._g.attrs["nodes"][name]
+
+ return -1
+
+ def _chk_parent(self, parent: str):
+ """Check if parent exists"""
+ if not parent in self._g.attrs["nodes"].keys():
+ raise ValueError('Parent name "{}" not found!'.format(parent))
+
+ return True
+
+ def _chk_name(self, name: str):
+ """Check if component name is valid"""
+ # check if name exists
+ if name in self._g.attrs["nodes"].keys():
+ raise ValueError('Component name "{}" is already used!'.format(name))
+
+ return True
+
+ def _get_childs_tree(self, node: int):
+ """Get dict of parent/childs"""
+ childs = list(rx.bfs_successors(self._g, node))
+ cdict = {}
+ for c in childs:
+ cs = []
+ for l in c[1]:
+ cs += [self._g.attrs["nodes"][l._params["name"]]]
+ cdict[self._g.attrs["nodes"][c[0]._params["name"]]] = cs
+ return cdict
+
+ def _get_nodes(self):
+ """Get list of nodes in system"""
+ return [n for n in self._g.node_indices()]
+
+ def _get_childs(self):
+ """Get list of children of each node"""
+ nodes = self._get_nodes()
+ cs = list(-np.ones(max(nodes) + 1, dtype=np.int32))
+ for n in nodes:
+ if self._g.out_degree(n) > 0:
+ ind = [i for i in self._g.successor_indices(n)]
+ cs[n] = ind
+ return cs
+
+ def _get_parents(self):
+ """Get list of parent of each node"""
+ nodes = self._get_nodes()
+ ps = list(-np.ones(max(nodes) + 1, dtype=np.int32))
+ for n in nodes:
+ if self._g.in_degree(n) > 0:
+ ind = [i for i in self._g.predecessor_indices(n)]
+ ps[n] = ind
+ return ps
+
+ def _get_sources(self):
+ """Get list of sources"""
+ tn = [n for n in rx.topological_sort(self._g)]
+ return [n for n in tn if isinstance(self._g[n], Source)]
+
+ def _get_topo_sort(self):
+ """Get nodes topological sorted"""
+ tps = rx.topological_sort(self._g)
+ return [n for n in tps]
+
+ def _sys_vars(self):
+ """Get system variable lists"""
+ vn = max(self._get_nodes()) + 1 # highest node index + 1
+ v = list(np.zeros(vn)) # voltages
+ i = list(np.zeros(vn)) # currents
+ return v, i
+
+ def _make_rtree(self, adj, node):
+ """Create Rich tree"""
+ tree = Tree(node)
+ for child in adj.get(node, []):
+ tree.add(self._make_rtree(adj, child))
+ return tree
+
+ def add_comp(self, parent: str, *, comp):
+ """Add component to system.
+
+ Parameters
+ ----------
+ parent : str
+ Name of parent component.
+ comp : component
+ Component (from :py:mod:`~sysloss.components`).
+
+ Raises
+ ------
+ ValueError
+ If parent does not allow connection to component.
+ """
+ # check that parent exists
+ self._chk_parent(parent)
+ # check that component name is unique
+ self._chk_name(comp._params["name"])
+ # check that parent allows component type as child
+ pidx = self._get_index(parent)
+ if not comp._component_type in self._g[pidx]._child_types:
+ raise ValueError(
+ "Parent does not allow child of type {}!".format(
+ comp._component_type.name
+ )
+ )
+ cidx = self._g.add_child(pidx, comp, None)
+ self._g.attrs["nodes"][comp._params["name"]] = cidx
+ # if not isinstance(phase_config, dict) and not isinstance(phase_config, list):
+ # raise ValueError("phase_config must be dict or list")
+ self._g.attrs["phase_conf"][comp._params["name"]] = {}
+
+ def add_source(self, source: Source):
+ """Add an additional Source to the system.
+
+ Parameters
+ ----------
+ source : Source
+ Source component.
+
+ Raises
+ ------
+ ValueError
+ If `source` is not a Source class.
+ """
+ self._chk_name(source._params["name"])
+ if not isinstance(source, Source):
+ raise ValueError("Component must be a source!")
+
+ pidx = self._g.add_node(source)
+ self._g.attrs["nodes"][source._params["name"]] = pidx
+ self._g.attrs["phase_conf"][source._params["name"]] = {}
+
+ def change_comp(self, name: str, *, comp):
+ """Replace component.
+
+ The new component can be of same type (parameter change), or a new type
+ given that the parent component accepts the connection.
+
+ Parameters
+ ----------
+ name : str
+ Name of component to be changed.
+ comp : component
+ Component (from :py:mod:`~sysloss.components`).
+
+ Raises
+ ------
+ ValueError
+ If trying to change a `source` component to a different type, or
+ if the parent does not accept a connection to the new component.
+ """
+ # if component name changes, check that it is unique
+ if name != comp._params["name"]:
+ self._chk_name(comp._params["name"])
+
+ # source can only be changed to source
+ eidx = self._get_index(name)
+ if self._g[eidx]._component_type == _ComponentTypes.SOURCE:
+ if not isinstance(comp, Source):
+ raise ValueError("Source cannot be changed to other type!")
+
+ # check that parent allows component type as child
+ parents = self._get_parents()
+ if parents[eidx] != -1:
+ if not comp._component_type in self._g[parents[eidx][0]]._child_types:
+ raise ValueError(
+ "Parent does not allow child of type {}!".format(
+ comp._component_type.name
+ )
+ )
+ self._g[eidx] = comp
+ # replace node name in graph dict
+ del [self._g.attrs["nodes"][name]]
+ self._g.attrs["nodes"][comp._params["name"]] = eidx
+
+ def del_comp(self, name: str, *, del_childs: bool = True):
+ """Delete component.
+
+ Deleting the last component (Source) in a system is not allowed.
+ In a system with multiple sources, a source can only be deleted
+ together with its child components.
+
+ Parameters
+ ----------
+ name : str
+ Name of component to delete.
+ del_childs : bool, optional
+ Delete all child components as well., by default True
+
+ Raises
+ ------
+ ValueError
+ If the component does not exist, is the last source or
+ a source with `del_childs` set to False.
+ """
+ eidx = self._get_index(name)
+ if eidx == -1:
+ raise ValueError("Component name does not exist!")
+ parents = self._get_parents()
+ if parents[eidx] == -1: # source node
+ if not del_childs:
+ raise ValueError("Source must be deleted with its childs")
+ if len(self._get_sources()) < 2:
+ raise ValueError("Cannot delete the last source node!")
+ childs = self._get_childs()
+ # if not leaf, check if child type is allowed by parent type (not possible?)
+ # if leaves[eidx] == 0:
+ # for c in childs[eidx]:
+ # if not self._g[c]._component_type in self._g[parents[eidx]]._child_types:
+ # raise ValueError(
+ # "Parent and child of component are not compatible!"
+ # )
+ # delete childs first if selected
+ if del_childs:
+ for c in rx.descendants(self._g, eidx):
+ del [self._g.attrs["nodes"][self._g[c]._params["name"]]]
+ del [self._g.attrs["phase_conf"][self._g[c]._params["name"]]]
+ self._g.remove_node(c)
+ # delete node
+ self._g.remove_node(eidx)
+ del [self._g.attrs["nodes"][name]]
+ del [self._g.attrs["phase_conf"][name]]
+ # restore links between new parent and childs, unless deleted
+ if not del_childs:
+ if childs[eidx] != -1:
+ for c in childs[eidx]:
+ self._g.add_edge(parents[eidx][0], c, None)
+
+ def tree(self, name=""):
+ """Print the tree structure of the system.
+
+ The tree object is generated with `Rich `_.
+
+ Parameters
+ ----------
+ name : str, optional
+ Name of component to start with. If not given, print the entire system., by default ""
+
+ Returns
+ -------
+ rich.tree.Tree
+ System Tree class.
+
+ Raises
+ ------
+ ValueError
+ If the component name is invalid.
+ """
+ if not name == "":
+ if not name in self._g.attrs["nodes"].keys():
+ raise ValueError("Component name is not valid!")
+ root = [name]
+ else:
+ ridx = self._get_sources()
+ root = [self._g[n]._params["name"] for n in ridx]
+
+ t = Tree(self._g.attrs["name"])
+ for n in root:
+ adj = rx.bfs_successors(self._g, self._g.attrs["nodes"][n])
+ ndict = {}
+ for i in adj:
+ c = []
+ for j in i[1]:
+ c += [j._params["name"]]
+ ndict[i[0]._params["name"]] = c
+ t.add(self._make_rtree(ndict, n))
+ return t
+
+ def _set_phase_lkup(self):
+ """Make lookup from node # to load phases"""
+ self._phase_lkup = {}
+ for c in self._g.attrs["phase_conf"].items():
+ self._phase_lkup[self._get_index(c[0])] = c[1]
+
+ def _sys_init(self, phase: str = ""):
+ """Create vectors of init values for solver"""
+ v, i = self._sys_vars()
+ self._set_phase_lkup()
+ for n in self._get_nodes():
+ v[n] = self._g[n]._get_outp_voltage(phase, self._phase_lkup[n])
+ i[n] = self._g[n]._get_inp_current(phase, self._phase_lkup[n])
+ return v, i
+
+ def _fwd_prop(self, v: float, i: float, phase: str = ""):
+ """Forward propagation of voltages"""
+ vo, _ = self._sys_vars()
+ # update output voltages (per node)
+ for n in self._topo_nodes:
+ p = self._parents[n]
+ phase_config = self._phase_lkup[n]
+ if self._childs[n] == -1: # leaf
+ if p == -1: # root
+ vo[n] = self._g[n]._solv_outp_volt(
+ 0.0,
+ 0.0,
+ 0.0,
+ phase,
+ phase_config,
+ )
+ else:
+ vo[n] = self._g[n]._solv_outp_volt(
+ v[p[0]],
+ i[n],
+ 0.0,
+ phase,
+ phase_config,
+ )
+ else:
+ # add currents into childs
+ isum = 0
+ for c in self._childs[n]:
+ isum += i[c]
+ if p == -1: # root
+ vo[n] = self._g[n]._solv_outp_volt(
+ 0.0,
+ 0.0,
+ isum,
+ phase,
+ phase_config,
+ )
+ else:
+ vo[n] = self._g[n]._solv_outp_volt(
+ v[p[0]],
+ i[n],
+ isum,
+ phase,
+ phase_config,
+ )
+ return vo
+
+ def _back_prop(self, v: float, i: float, phase: str = ""):
+ """Backward propagation of currents"""
+ _, ii = self._sys_vars()
+ # update input currents (per node)
+ for n in self._topo_nodes[::-1]:
+ p = self._parents[n]
+ phase_config = self._phase_lkup[n]
+ if self._childs[n] == -1: # leaf
+ if p == -1: # root
+ ii[n] = self._g[n]._solv_inp_curr(
+ v[n],
+ 0.0,
+ 0.0,
+ phase,
+ phase_config,
+ )
+ else:
+ ii[n] = self._g[n]._solv_inp_curr(
+ v[p[0]],
+ 0.0,
+ 0.0,
+ phase,
+ phase_config,
+ )
+ else:
+ isum = 0.0
+ for c in self._childs[n]:
+ isum += i[c]
+ if p == -1: # root
+ ii[n] = self._g[n]._solv_inp_curr(
+ v[n],
+ v[n],
+ isum,
+ phase,
+ phase_config,
+ )
+ else:
+ ii[n] = self._g[n]._solv_inp_curr(
+ v[p[0]],
+ v[n],
+ isum,
+ phase,
+ phase_config,
+ )
+
+ return ii
+
+ def _rel_update(self):
+ """Update lists with component relationships"""
+ self._parents = self._get_parents()
+ self._childs = self._get_childs()
+ self._topo_nodes = self._get_topo_sort()
+
+ def _get_parent_name(self, node):
+ """Get parent name of node"""
+ if self._parents[node] == -1:
+ return ""
+ return self._g[self._parents[node][0]]._params["name"]
+
+ def _solve(self, vtol=1e-5, itol=1e-6, maxiter=10000, quiet=True, phase: str = ""):
+ """Solver"""
+ v, i = self._sys_init(phase)
+ iters = 0
+ while iters <= maxiter:
+ vi = self._fwd_prop(v, i, phase)
+ ii = self._back_prop(vi, i, phase)
+ iters += 1
+ if np.allclose(np.array(v), np.array(vi), rtol=vtol) and np.allclose(
+ np.array(i), np.array(ii), rtol=itol
+ ):
+ if not quiet:
+ pname = ""
+ if phase != "":
+ pname = "'{}': ".format(phase)
+ print("{}Tolerances met after {} iterations".format(pname, iters))
+ break
+ v, i = vi, ii
+ return v, i, iters
+
+ def _calc_energy(self, phase, pwr):
+ """Calculate energy per 24h"""
+ if phase == "":
+ return pwr * 24.0
+ tot_time = 0.0
+ for ph in self._g.attrs["phases"].keys():
+ tot_time += self._g.attrs["phases"][ph]
+ cycles = 24 * 3600.0 / tot_time
+ return (self._g.attrs["phases"][phase] / 3600.0) * pwr * cycles
+
+ def solve(
+ self,
+ *,
+ vtol: float = 1e-6,
+ itol: float = 1e-6,
+ maxiter: int = 10000,
+ quiet: bool = True,
+ phase: str = "",
+ energy: bool = False,
+ tags: dict = {}
+ ) -> pd.DataFrame:
+ """Analyze steady-state of system.
+
+ Parameters
+ ----------
+ vtol : float, optional
+ Voltage tolerance., by default 1e-6
+ itol : float, optional
+ Current tolerance., by default 1e-6
+ maxiter : int, optional
+ Maximum number of iterations., by default 10000
+ quiet : bool, optional
+ Do not print # of iterations used., by default True
+ phase : str, optional
+ Load phase to analyze (all if not specified), by default ""
+ energy : bool, optional
+ Show energy consumption per 24h., by default False
+ tags: dict, optional
+ Tag-value pairs that will be added to the results table
+
+ Returns
+ -------
+ pd.DataFrame
+ Analysis result.
+
+ Raises
+ ------
+ ValueError
+ If the specified phase is not defined. See :py:meth:`~system.System.set_phases`.
+ RuntimeError
+ If a steady-state solution has not been found after `maxiter` iterations.
+ """
+ self._rel_update()
+ phase_list = [""]
+ if phase != "":
+ if phase not in list(self._g.attrs["phases"].keys()):
+ raise ValueError(
+ "The specified phase '{}' is not defined".format(phase)
+ )
+ phase_list = [phase]
+ elif len(list(self._g.attrs["phases"].keys())) > 0:
+ phase_list = list(self._g.attrs["phases"].keys())
+ # solve
+ ppwr, ploss, peff, ptime, pener = [], [], [], [], []
+ frames = []
+ for ph in phase_list:
+ v, i, iters = self._solve(vtol, itol, maxiter, quiet, ph)
+ if iters > maxiter:
+ raise RuntimeError(
+ "Steady-state not achieved after {} iterations".format(iters - 1)
+ )
+ # calculate results for each node
+ names, parent, typ, pwr, loss = [], [], [], [], []
+ eff, warn, vsi, iso, vso, isi = [], [], [], [], [], []
+ domain, phases, ener, dname = [], [], [], "none"
+ sources, dwarns = {}, {}
+ for n in self._topo_nodes: # [vi, vo, ii, io]
+ phase_config = self._phase_lkup[n]
+ names += [self._g[n]._params["name"]]
+ if self._g[n]._component_type.name == "SOURCE":
+ dname = self._g[n]._params["name"]
+ domain += [dname]
+ phases += [ph]
+ vi = v[n]
+ vo = v[n]
+ ii = i[n]
+ io = i[n]
+ p = self._parents[n]
+
+ if p == -1: # root
+ vi = v[n] + self._g[n]._params["rs"] * ii
+ elif self._childs[n] == -1: # leaf
+ vi = v[p[0]]
+ io = 0.0
+ else:
+ io = 0.0
+ for c in self._childs[n]:
+ io += i[c]
+ vi = v[p[0]]
+ parent += [self._get_parent_name(n)]
+ p, l, e = self._g[n]._solv_pwr_loss(vi, vo, ii, io, ph, phase_config)
+ pwr += [p]
+ loss += [l]
+ eff += [e]
+ typ += [self._g[n]._component_type.name]
+ ener += [self._calc_energy(ph, p)]
+ if self._g[n]._component_type.name == "SOURCE":
+ sources[dname] = vi
+ dwarns[dname] = 0
+ w = self._g[n]._solv_get_warns(vi, vo, ii, io, ph, phase_config)
+ warn += [w]
+ if w != "":
+ dwarns[dname] = 1
+ vsi += [vi]
+ iso += [io]
+ vso += [v[n]]
+ isi += [i[n]]
+
+ # subsystems summary
+ for d in range(len(sources)):
+ names += ["Subsystem {}".format(list(sources.keys())[d])]
+ typ += [""]
+ parent += [""]
+ domain += [""]
+ phases += [ph]
+ vsi += [sources[list(sources.keys())[d]]]
+ vso += [""]
+ isi += [""]
+ iso += [""]
+ pwr += [""]
+ loss += [""]
+ eff += [""]
+ ener += [""]
+ if dwarns[list(sources.keys())[d]] > 0:
+ warn += ["Yes"]
+ else:
+ warn += [""]
+
+ # system total
+ names += ["System total"]
+ typ += [""]
+ parent += [""]
+ domain += [""]
+ phases += [ph]
+ vsi += [""]
+ vso += [""]
+ isi += [""]
+ iso += [""]
+ pwr += [""]
+ loss += [""]
+ eff += [""]
+ ener += [""]
+ if any(warn):
+ warn += ["Yes"]
+ else:
+ warn += [""]
+
+ # report
+ res = {}
+ res["Component"] = names
+ res["Type"] = typ
+ res["Parent"] = parent
+ res["Domain"] = domain
+ if tags != {}:
+ for key in tags.keys():
+ res[key] = [tags[key]] * len(names)
+ if ph != "":
+ res["Phase"] = phases
+ res["Vin (V)"] = vsi
+ res["Vout (V)"] = vso
+ res["Iin (A)"] = isi
+ res["Iout (A)"] = iso
+ res["Power (W)"] = pwr
+ res["Loss (W)"] = loss
+ res["Efficiency (%)"] = eff
+ if energy:
+ res["24h energy (Wh)"] = ener
+ res["Warnings"] = warn
+ df = pd.DataFrame(res)
+
+ # update subsystem power/loss/efficiency/energy
+ for d in range(len(sources)):
+ src = list(sources.keys())[d]
+ idx = df[df.Component == "Subsystem {}".format(src)].index[0]
+ pwr = df[(df.Domain == src) & (df.Type == "SOURCE")][
+ "Power (W)"
+ ].values[0]
+ df.at[idx, "Power (W)"] = pwr
+ loss = df[df.Domain == src]["Loss (W)"].sum()
+ df.at[idx, "Loss (W)"] = loss
+ df.at[idx, "Efficiency (%)"] = _get_eff(pwr, pwr - loss)
+ if energy:
+ df.at[idx, "24h energy (Wh)"] = self._calc_energy(ph, pwr)
+
+ # update system total
+ pwr = df[(df.Domain == "") & (df["Power (W)"] != "")]["Power (W)"].sum()
+ idx = df.index[-1]
+ df.at[idx, "Power (W)"] = pwr
+ loss = df[(df.Domain == "") & (df["Loss (W)"] != "")]["Loss (W)"].sum()
+ df.at[idx, "Loss (W)"] = loss
+ df.at[idx, "Efficiency (%)"] = _get_eff(pwr, pwr - loss)
+ if energy:
+ df.at[idx, "24h energy (Wh)"] = self._calc_energy(ph, pwr)
+ if len(phase_list) > 1:
+ ploss += [loss]
+ ppwr += [pwr]
+ peff += [_get_eff(pwr, pwr - loss)]
+ ptime += [self._g.attrs["phases"][ph]]
+ pener += [self._calc_energy(ph, pwr)]
+
+ # if only one subsystem, delete subsystem row and domain column
+ if len(sources) < 2:
+ df.drop(len(df) - 2, inplace=True)
+ df.drop(columns="Domain", inplace=True)
+ df.reset_index(inplace=True, drop=True)
+ frames += [df]
+
+ if len(phase_list) > 1:
+ ttot = np.sum(np.asarray(ptime))
+ apwr = np.sum(np.multiply(np.asarray(ppwr), np.asarray(ptime))) / ttot
+ aloss = np.sum(np.multiply(np.asarray(ploss), np.asarray(ptime))) / ttot
+ aeff = np.sum(np.multiply(np.asarray(peff), np.asarray(ptime))) / ttot
+ vals = ["System average", apwr, aloss, aeff]
+ idxs = ["Component", "Power (W)", "Loss (W)", "Efficiency (%)"]
+ if energy:
+ vals += [self._calc_energy("", apwr)]
+ idxs += ["24h energy (Wh)"]
+ if tags != {}:
+ for key in tags.keys():
+ idxs += [key]
+ vals += [tags[key]]
+ avg = pd.Series(vals, index=idxs)
+ frames += [avg.to_frame().T]
+ dff = pd.concat(frames, ignore_index=True)
+ return dff.replace(np.nan, "")
+
+ def params(self, limits: bool = False) -> pd.DataFrame:
+ """Return component parameters.
+
+ Parameters
+ ----------
+ limits : bool, optional
+ Include limits., by default False
+
+ Returns
+ -------
+ pd.DataFrame
+ System parameters.
+ """
+ self._rel_update()
+ names, typ, parent, vo, vdrop = [], [], [], [], []
+ iq, rs, eff, ii, pwr, iis = [], [], [], [], [], []
+ lii, lio, lvi, lvo, pwrs = [], [], [], [], []
+ domain, dname = [], "none"
+ src_cnt = 0
+ for n in self._topo_nodes:
+ names += [self._g[n]._params["name"]]
+ typ += [self._g[n]._component_type.name]
+ if self._g[n]._component_type.name == "SOURCE":
+ dname = self._g[n]._params["name"]
+ src_cnt += 1
+ domain += [dname]
+ _vo, _vdrop, _iq, _rs, _eff, _ii, _pwr = "", "", "", "", "", "", ""
+ _iis, _pwrs = "", ""
+ if self._g[n]._component_type == _ComponentTypes.SOURCE:
+ _vo = self._g[n]._params["vo"]
+ _rs = self._g[n]._params["rs"]
+ elif self._g[n]._component_type == _ComponentTypes.LOAD:
+ if "pwr" in self._g[n]._params:
+ _pwr = self._g[n]._params["pwr"]
+ _pwrs = self._g[n]._params["pwrs"]
+ elif "rs" in self._g[n]._params:
+ _rs = self._g[n]._params["rs"]
+ else:
+ _ii = self._g[n]._params["ii"]
+ _iis = self._g[n]._params["iis"]
+ elif self._g[n]._component_type == _ComponentTypes.CONVERTER:
+ _vo = self._g[n]._params["vo"]
+ _iq = self._g[n]._params["iq"]
+ if isinstance(self._g[n]._ipr, _Interp0d):
+ _eff = self._g[n]._params["eff"]
+ else:
+ _eff = "interp"
+ _iis = self._g[n]._params["iis"]
+ elif self._g[n]._component_type == _ComponentTypes.LINREG:
+ _vo = self._g[n]._params["vo"]
+ _vdrop = self._g[n]._params["vdrop"]
+ _iq = self._g[n]._params["iq"]
+ _iis = self._g[n]._params["iis"]
+ elif self._g[n]._component_type == _ComponentTypes.SLOSS:
+ if "rs" in self._g[n]._params:
+ _rs = self._g[n]._params["rs"]
+ else:
+ if isinstance(self._g[n]._ipr, _Interp0d):
+ _vdrop = self._g[n]._params["vdrop"]
+ else:
+ _vdrop = "interp"
+ vo += [_vo]
+ vdrop += [_vdrop]
+ iq += [_iq]
+ rs += [_rs]
+ eff += [_eff]
+ ii += [_ii]
+ pwr += [_pwr]
+ iis += [_iis]
+ pwrs += [_pwrs]
+ parent += [self._get_parent_name(n)]
+ if limits:
+ lii += [_get_opt(self._g[n]._limits, "ii", LIMITS_DEFAULT["ii"])]
+ lio += [_get_opt(self._g[n]._limits, "io", LIMITS_DEFAULT["io"])]
+ lvi += [_get_opt(self._g[n]._limits, "vi", LIMITS_DEFAULT["vi"])]
+ lvo += [_get_opt(self._g[n]._limits, "vo", LIMITS_DEFAULT["vo"])]
+ # report
+ res = {}
+ res["Component"] = names
+ res["Type"] = typ
+ res["Parent"] = parent
+ if src_cnt > 1:
+ res["Domain"] = domain
+ res["vo (V)"] = vo
+ res["vdrop (V)"] = vdrop
+ res["rs (Ohm)"] = rs
+ res["eff (%)"] = eff
+ res["iq (A)"] = iq
+ res["ii (A)"] = ii
+ res["iis (A)"] = iis
+ res["pwr (W)"] = pwr
+ res["pwrs (W)"] = pwrs
+ if limits:
+ res["vi limits (V)"] = lvi
+ res["vo limits (V)"] = lvo
+ res["ii limits (A)"] = lii
+ res["io limits (A)"] = lio
+ return pd.DataFrame(res)
+
+ def set_sys_phases(self, phases: dict):
+ """Define system level load phases.
+
+ Parameters
+ ----------
+ phases : dict
+ A dict defining the system level load phases.
+ Each entry in the form '"name": duration(s)'.
+
+ Raises
+ ------
+ ValueError
+ If the dict contains less than two load phases or 'N/A' is used as
+ a phase name.
+ """
+ if len(list(phases.keys())) < 2:
+ raise ValueError("There must be at least two phases!")
+ if "N/A" in list(phases.keys()):
+ raise ValueError('"N/A" is a reserved name!')
+ self._g.attrs["phases"] = phases
+
+ def get_sys_phases(self) -> dict:
+ """Get the system level load phases.
+
+ Returns
+ -------
+ dict
+ System load phases. Empty dict if no phases have been defined.
+ """
+ return self._g.attrs["phases"]
+
+ def set_comp_phases(self, name: str, phase_conf: dict | list):
+ """Define component load phases
+
+ Parameters
+ ----------
+ name : str
+ Component name.
+ phase_conf : dict | list
+ Phase configuration.
+
+ Raises
+ ------
+ ValueError
+ Component does not exist, or phase configuration is invalid.
+ """
+ cidx = self._get_index(name)
+ if cidx == -1:
+ raise ValueError("Component name does not exist!")
+ if not isinstance(phase_conf, dict) and not isinstance(phase_conf, list):
+ raise ValueError("phase_conf must be a dict or list!")
+ if isinstance(self._g[cidx], Source):
+ raise ValueError("Source components does not support load phases!")
+ if isinstance(self._g[cidx], RLoss) or isinstance(self._g[cidx], VLoss):
+ raise ValueError("Loss components does not support load phases!")
+
+ self._g.attrs["phase_conf"][name] = phase_conf
+
+ def phases(self) -> pd.DataFrame:
+ """Return load phases and parameters for all system components.
+
+ Returns
+ -------
+ pd.DataFrame
+ DataFrame with parameters and load phases.
+ """
+ self._rel_update()
+ if self._g.attrs["phases"] == {}:
+ return None
+ names, typ, parent, phase = [], [], [], []
+ rs, ii, pwr = [], [], []
+ domain, dname = [], "none"
+ phase_names = list(self._g.attrs["phases"].keys())
+ self._set_phase_lkup()
+ src_cnt = 0
+ for n in self._topo_nodes:
+ tname = self._g[n]._component_type.name
+ if tname == "SOURCE":
+ dname = self._g[n]._params["name"]
+ src_cnt += 1
+ ph_names = []
+ if tname == "SOURCE" or tname == "SLOSS":
+ ph_names += ["N/A"]
+ elif tname == "CONVERTER" or tname == "LINREG":
+ if len(self._phase_lkup[n]) > 0:
+ for p in phase_names:
+ if p in self._phase_lkup[n]:
+ ph_names += [p]
+ if ph_names == []:
+ ph_names += ["N/A"]
+ elif tname == "LOAD":
+ if len(list(self._phase_lkup[n].keys())) > 0:
+ for p in phase_names:
+ if p in list(self._phase_lkup[n].keys()):
+ ph_names += [p]
+ if ph_names == []:
+ ph_names += ["N/A"]
+
+ for p in ph_names:
+ names += [self._g[n]._params["name"]]
+ typ += [tname]
+ domain += [dname]
+ parent += [self._get_parent_name(n)]
+ phase += [p]
+ if tname == "SOURCE" or tname == "SLOSS":
+ rs += [""]
+ ii += [""]
+ pwr += [""]
+ break
+ if tname == "CONVERTER" or tname == "LINREG":
+ rs += [""]
+ ii += [""]
+ pwr += [""]
+ if tname == "LOAD":
+ if "pwr" in self._g[n]._params:
+ rs += [""]
+ ii += [""]
+ if p == "N/A":
+ pwr += [self._g[n]._params["pwr"]]
+ else:
+ pwr += [self._phase_lkup[n][p]]
+ elif "rs" in self._g[n]._params:
+ ii += [""]
+ pwr += [""]
+ if p == "N/A":
+ rs += [self._g[n]._params["rs"]]
+ else:
+ rs += [self._phase_lkup[n][p]]
+ else:
+ rs += [""]
+ pwr += [""]
+ if p == "N/A":
+ ii += [self._g[n]._params["ii"]]
+ else:
+ ii += [self._phase_lkup[n][p]]
+
+ # report
+ res = {}
+ res["Component"] = names
+ res["Type"] = typ
+ res["Parent"] = parent
+ if src_cnt > 1:
+ res["Domain"] = domain
+ res["Active phase"] = phase
+ res["rs (Ohm)"] = rs
+ res["ii (A)"] = ii
+ res["pwr (W)"] = pwr
+ return pd.DataFrame(res)
+
+ def save(self, fname: str, *, indent: int = 4):
+ """Save system as a .json file.
+
+ Parameters
+ ----------
+ fname : str
+ Filename.
+ indent : int, optional
+ Indentation to use in .json file, by default 4
+ """
+ self._rel_update()
+ sys = {
+ "system": {
+ "name": self._g.attrs["name"],
+ "version": "1.0.0",
+ "phases": self._g.attrs["phases"],
+ "phase_conf": self._g.attrs["phase_conf"],
+ }
+ } # TODO: version
+ ridx = self._get_sources()
+ root = [self._g[n]._params["name"] for n in ridx]
+ for r in range(len(ridx)):
+ tree = self._get_childs_tree(ridx[r])
+ cdict = {}
+ if tree != {}:
+ for e in tree:
+ childs = []
+ for c in tree[e]:
+ childs += [
+ {
+ "type": self._g[c]._component_type.name,
+ "params": self._g[c]._params,
+ "limits": self._g[c]._limits,
+ }
+ ]
+ cdict[self._g[e]._params["name"]] = childs
+ sys[root[r]] = {
+ "type": self._g[ridx[r]]._component_type.name,
+ "params": self._g[ridx[r]]._params,
+ "limits": self._g[ridx[r]]._limits,
+ "childs": cdict,
+ }
+
+ with open(fname, "w") as f:
+ json.dump(sys, f, indent=indent)
+
+ def plot_interp(
+ self,
+ name: str,
+ *,
+ cmap: matplotlib.colors.Colormap = "viridis",
+ inpdata: bool = True,
+ plot3d: bool = False
+ ) -> matplotlib.figure.Figure | None:
+ """Plot 1D or 2D interpolation data.
+
+ If a component has a parameter defined as either 1D or 2D interpolation data,
+ a figure is returned with linear interpolation shown. 1D data is plotted as an
+ interpolated line. 2D data can be shown as 2D color map or 3D surface. The
+ interpolated data is extended to +/-15% outside of input data points.
+
+ Parameters
+ ----------
+ name : str
+ Name of component.
+ cmap : matplotlib.colors.Colormap, optional
+ Colormap to use for 3D-plot., by default "viridis"
+ inpdata : bool, optional
+ Show input data (as red dots)., by default True
+ plot3d : bool, optional
+ Plot 3D surface (for 2D data), by default False
+
+ Returns
+ -------
+ matplotlib.figure.Figure | None
+ Interpolated parameter data figure. If the component does not have interpolation
+ data, `None` is returned.
+
+ Raises
+ ------
+ ValueError
+ If component name is not found.
+ """
+ if not name in self._g.attrs["nodes"].keys():
+ raise ValueError("Component name is not valid!")
+ n = self._g.attrs["nodes"][name]
+ if isinstance(self._g[n]._ipr, _Interp1d):
+ fig = plt.figure()
+ xmin = max(self._g[n]._ipr._x[0] - 0.15 * max(self._g[n]._ipr._x), 0.0)
+ xmax = 1.15 * max(self._g[n]._ipr._x)
+ x = np.linspace(xmin, xmax, num=200)
+ fx = np.interp(x, self._g[n]._ipr._x, self._g[n]._ipr._fx)
+ plt.plot(x, fx, "-")
+ if inpdata:
+ plt.plot(
+ self._g[n]._ipr._x, self._g[n]._ipr._fx, ".r", label="input data"
+ )
+ plt.legend(loc="lower right")
+ plt.xlabel("Output current (A)")
+ if "vo" in self._g[n]._params:
+ plt.ylabel("Efficiency")
+ plt.title(
+ "{} efficiency for Vo={}V".format(name, self._g[n]._params["vo"])
+ )
+ else:
+ plt.ylabel("Voltage drop (V)")
+ plt.title("{} voltage drop".format(name))
+ plt.rc("axes", axisbelow=True)
+ plt.grid()
+ return fig
+ elif isinstance(self._g[n]._ipr, _Interp2d):
+ xmin = max(min(self._g[n]._ipr._x) - 0.15 * max(self._g[n]._ipr._x), 0.0)
+ xmax = 1.15 * max(self._g[n]._ipr._x)
+ X = np.linspace(xmin, xmax, num=100)
+ ymin = max(min(self._g[n]._ipr._y) - 0.15 * max(self._g[n]._ipr._y), 0.0)
+ ymax = 1.15 * max(self._g[n]._ipr._y)
+ Y = np.linspace(ymin, ymax, num=100)
+ X, Y = np.meshgrid(X, Y)
+ interp = LinearNDInterpolator(
+ list(zip(self._g[n]._ipr._x, self._g[n]._ipr._y)), self._g[n]._ipr._fxy
+ )
+ Z = interp(X, Y)
+ for i in range(len(X)):
+ for j in range(len(Y)):
+ if np.isnan(Z[i, j]):
+ Z[i, j] = self._g[n]._ipr._interp(X[i, j], Y[i, j])
+ if not plot3d:
+ fig = plt.figure()
+ plt.pcolormesh(X, Y, Z, shading="auto", cmap=cmap)
+ if inpdata:
+ plt.plot(
+ self._g[n]._ipr._x, self._g[n]._ipr._y, ".r", label="input data"
+ )
+ plt.legend(loc="upper left")
+ plt.colorbar()
+ plt.xlabel("Output current (A)")
+ plt.ylabel("Input voltage (V)")
+ else:
+ fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
+ surf = ax.plot_surface(
+ Y, X, Z, cmap=cmap, linewidth=0, antialiased=False
+ )
+ ax.set_zlim(np.nanmin(Z), 1.0)
+ ax.zaxis.set_major_locator(LinearLocator(10))
+ ax.zaxis.set_major_formatter("{x:.02f}")
+ if inpdata:
+ plt.plot(
+ self._g[n]._ipr._y,
+ self._g[n]._ipr._x,
+ self._g[n]._ipr._fxy,
+ ".r",
+ label="input data",
+ )
+ plt.legend(loc="upper left")
+ fig.colorbar(surf, shrink=0.5, aspect=10, pad=0.1)
+ plt.ylabel("Output current (A)")
+ plt.xlabel("Input voltage (V)")
+ if "vo" in self._g[n]._params:
+ plt.title(
+ "{} efficiency for Vo={}V".format(name, self._g[n]._params["vo"])
+ )
+ else:
+ plt.title("{} voltage drop".format(name))
+ return fig
+ else:
+ print("Component does not have interpolation data")
+ return None
diff --git a/tests/data/System v1.0.0.json b/tests/data/System v1.0.0.json
new file mode 100644
index 0000000..85d1ebf
--- /dev/null
+++ b/tests/data/System v1.0.0.json
@@ -0,0 +1,455 @@
+{
+ "system": {
+ "name": "Version 1.0.0 system",
+ "version": "1.0.0",
+ "phases": {
+ "one": 3.0,
+ "two": 0.24,
+ "three": 1.25,
+ "four": 3.3
+ },
+ "phase_conf": {
+ "5V": {},
+ "Buck 3.3V 0D": {},
+ "Buck 3.3V 1D": [
+ "one",
+ "two"
+ ],
+ "Buck 3.3V 2D": {},
+ "RLoss": {},
+ "VLoss 0D": {},
+ "VLoss 1D": {},
+ "VLoss 2D": {},
+ "PLoad 1": {
+ "one": 0.2,
+ "three": 0.37,
+ "four": 0.55
+ },
+ "ILoad 1": {},
+ "RLoad 1": {},
+ "ILoad 2": {
+ "two": 0.25,
+ "three": 0.44
+ },
+ "12V": {},
+ "RLoss 2": {},
+ "LinReg 1": [
+ "one",
+ "four"
+ ],
+ "PLoad 2": {}
+ }
+ },
+ "12V": {
+ "type": "SOURCE",
+ "params": {
+ "name": "12V",
+ "vo": 12,
+ "rs": 0.035
+ },
+ "limits": {
+ "io": [
+ 0.0,
+ 3.0
+ ]
+ },
+ "childs": {
+ "12V": [
+ {
+ "type": "SLOSS",
+ "params": {
+ "name": "RLoss 2",
+ "rs": 1.77
+ },
+ "limits": {
+ "vi": [
+ 0.0,
+ 48.0
+ ]
+ }
+ }
+ ],
+ "RLoss 2": [
+ {
+ "type": "LINREG",
+ "params": {
+ "name": "LinReg 1",
+ "vo": -4.5,
+ "vdrop": 0.35,
+ "iq": 0.00034,
+ "iis": 1.2e-05
+ },
+ "limits": {
+ "vi": [
+ 0.0,
+ 8
+ ],
+ "io": [
+ 0.0,
+ 0.66
+ ]
+ }
+ }
+ ],
+ "LinReg 1": [
+ {
+ "type": "LOAD",
+ "params": {
+ "name": "PLoad 2",
+ "pwr": 0.35,
+ "pwrs": 2e-06
+ },
+ "limits": {
+ "vi": [
+ 0.0,
+ 8.0
+ ]
+ }
+ }
+ ]
+ }
+ },
+ "5V": {
+ "type": "SOURCE",
+ "params": {
+ "name": "5V",
+ "vo": 5.0,
+ "rs": 0.1
+ },
+ "limits": {
+ "vi": [
+ 0.0,
+ 1000000.0
+ ],
+ "vo": [
+ 0.0,
+ 1000000.0
+ ],
+ "ii": [
+ 0.0,
+ 1000000.0
+ ],
+ "io": [
+ 0.0,
+ 1000000.0
+ ]
+ },
+ "childs": {
+ "5V": [
+ {
+ "type": "CONVERTER",
+ "params": {
+ "name": "Buck 3.3V 2D",
+ "vo": 3.1,
+ "eff": {
+ "vi": [
+ 36,
+ 20,
+ 9,
+ 3.3
+ ],
+ "io": [
+ 0.001,
+ 0.01,
+ 0.1,
+ 0.2,
+ 0.3
+ ],
+ "eff": [
+ [
+ 0.61,
+ 0.63,
+ 0.66,
+ 0.68,
+ 0.69
+ ],
+ [
+ 0.63,
+ 0.65,
+ 0.68,
+ 0.705,
+ 0.72
+ ],
+ [
+ 0.66,
+ 0.68,
+ 0.72,
+ 0.73,
+ 0.74
+ ],
+ [
+ 0.7,
+ 0.72,
+ 0.76,
+ 0.78,
+ 0.77
+ ]
+ ]
+ },
+ "iq": 0.001,
+ "iis": 0.0001
+ },
+ "limits": {
+ "vi": [
+ 0.0,
+ 1000000.0
+ ],
+ "vo": [
+ 0.0,
+ 1000000.0
+ ],
+ "ii": [
+ 0.0,
+ 1000000.0
+ ],
+ "io": [
+ 0.0,
+ 1000000.0
+ ]
+ }
+ },
+ {
+ "type": "CONVERTER",
+ "params": {
+ "name": "Buck 3.3V 1D",
+ "vo": 3.2,
+ "eff": {
+ "vi": [
+ 3.3
+ ],
+ "io": [
+ 0.1,
+ 0.5,
+ 0.9
+ ],
+ "eff": [
+ [
+ 0.55,
+ 0.78,
+ 0.92
+ ]
+ ]
+ },
+ "iq": 0.001,
+ "iis": 0.0001
+ },
+ "limits": {
+ "vi": [
+ 0.0,
+ 1000000.0
+ ],
+ "vo": [
+ 0.0,
+ 1000000.0
+ ],
+ "ii": [
+ 0.0,
+ 1000000.0
+ ],
+ "io": [
+ 0.0,
+ 1000000.0
+ ]
+ }
+ },
+ {
+ "type": "CONVERTER",
+ "params": {
+ "name": "Buck 3.3V 0D",
+ "vo": 3.3,
+ "eff": 0.88,
+ "iq": 0.001,
+ "iis": 0.0001
+ },
+ "limits": {
+ "vi": [
+ 0.0,
+ 1000000.0
+ ],
+ "vo": [
+ 0.0,
+ 1000000.0
+ ],
+ "ii": [
+ 0.0,
+ 1000000.0
+ ],
+ "io": [
+ 0.0,
+ 1000000.0
+ ]
+ }
+ }
+ ],
+ "Buck 3.3V 2D": [
+ {
+ "type": "SLOSS",
+ "params": {
+ "name": "VLoss 2D",
+ "vdrop": {
+ "vi": [
+ 24,
+ 48
+ ],
+ "io": [
+ 0.001,
+ 0.01,
+ 0.1,
+ 1,
+ 5
+ ],
+ "vdrop": [
+ [
+ 0.2,
+ 0.3,
+ 0.39,
+ 0.6,
+ 1.0
+ ],
+ [
+ 0.25,
+ 0.325,
+ 0.4,
+ 0.65,
+ 1.1
+ ]
+ ]
+ }
+ },
+ "limits": {
+ "ii": [
+ 0.0,
+ 8.0
+ ]
+ }
+ },
+ {
+ "type": "SLOSS",
+ "params": {
+ "name": "VLoss 1D",
+ "vdrop": {
+ "vi": [
+ 48
+ ],
+ "io": [
+ 0.001,
+ 0.01,
+ 0.1,
+ 1,
+ 5
+ ],
+ "vdrop": [
+ [
+ 0.25,
+ 0.325,
+ 0.4,
+ 0.65,
+ 1.1
+ ]
+ ]
+ }
+ },
+ "limits": {
+ "ii": [
+ 0.0,
+ 8.0
+ ]
+ }
+ }
+ ],
+ "Buck 3.3V 1D": [
+ {
+ "type": "SLOSS",
+ "params": {
+ "name": "VLoss 0D",
+ "vdrop": 0.27
+ },
+ "limits": {
+ "ii": [
+ 0.0,
+ 8.0
+ ]
+ }
+ }
+ ],
+ "Buck 3.3V 0D": [
+ {
+ "type": "SLOSS",
+ "params": {
+ "name": "RLoss",
+ "rs": 1.77
+ },
+ "limits": {
+ "vi": [
+ 0.0,
+ 48.0
+ ]
+ }
+ }
+ ],
+ "VLoss 2D": [
+ {
+ "type": "LOAD",
+ "params": {
+ "name": "ILoad 2",
+ "ii": 0.2,
+ "iis": 0.0
+ },
+ "limits": {
+ "vi": [
+ 0.0,
+ 10.0
+ ]
+ }
+ }
+ ],
+ "VLoss 1D": [
+ {
+ "type": "LOAD",
+ "params": {
+ "name": "RLoad 1",
+ "rs": 250
+ },
+ "limits": {
+ "vi": [
+ 0.0,
+ 8.0
+ ]
+ }
+ }
+ ],
+ "VLoss 0D": [
+ {
+ "type": "LOAD",
+ "params": {
+ "name": "ILoad 1",
+ "ii": 0.1,
+ "iis": 1.6e-06
+ },
+ "limits": {
+ "vi": [
+ 0.0,
+ 8.0
+ ]
+ }
+ }
+ ],
+ "RLoss": [
+ {
+ "type": "LOAD",
+ "params": {
+ "name": "PLoad 1",
+ "pwr": 0.1,
+ "pwrs": 1e-06
+ },
+ "limits": {
+ "vi": [
+ 0.0,
+ 8.0
+ ]
+ }
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/data/converter.toml b/tests/data/converter.toml
new file mode 100644
index 0000000..4b7ecb0
--- /dev/null
+++ b/tests/data/converter.toml
@@ -0,0 +1,10 @@
+[converter]
+vo = 5
+eff = 0.87
+iq = 0.0
+
+[limits]
+vi = [ 0.0, 1000000.0,]
+vo = [ 0.0, 1000000.0,]
+ii = [ 0.0, 1000000.0,]
+io = [ 0.0, 1000000.0,]
diff --git a/tests/data/iload.toml b/tests/data/iload.toml
new file mode 100644
index 0000000..447b5e8
--- /dev/null
+++ b/tests/data/iload.toml
@@ -0,0 +1,8 @@
+[iload]
+ii = 0.015
+
+[limits]
+vi = [ 0.0, 1000000.0,]
+vo = [ 0.0, 1000000.0,]
+ii = [ 0.0, 1000000.0,]
+io = [ 0.0, 1000000.0,]
diff --git a/tests/data/linreg.toml b/tests/data/linreg.toml
new file mode 100644
index 0000000..03a5731
--- /dev/null
+++ b/tests/data/linreg.toml
@@ -0,0 +1,9 @@
+[linreg]
+vo = 2.5
+vdrop = 0.3
+
+[limits]
+vi = [ 0.0, 1000000.0,]
+vo = [ 0.0, 1000000.0,]
+ii = [ 0.0, 1000000.0,]
+io = [ 0.0, 1000000.0,]
diff --git a/tests/data/linreg_bad.toml b/tests/data/linreg_bad.toml
new file mode 100644
index 0000000..6ad43ef
--- /dev/null
+++ b/tests/data/linreg_bad.toml
@@ -0,0 +1,2 @@
+[linreg]
+vdrop = 0.3
diff --git a/tests/data/pload.toml b/tests/data/pload.toml
new file mode 100644
index 0000000..453e154
--- /dev/null
+++ b/tests/data/pload.toml
@@ -0,0 +1,8 @@
+[pload]
+pwr = 27.0e-3
+
+[limits]
+vi = [ 0.0, 1000000.0,]
+vo = [ 0.0, 1000000.0,]
+ii = [ 0.0, 1000000.0,]
+io = [ 0.0, 1000000.0,]
diff --git a/tests/data/rload.toml b/tests/data/rload.toml
new file mode 100644
index 0000000..faea7dc
--- /dev/null
+++ b/tests/data/rload.toml
@@ -0,0 +1,8 @@
+[rload]
+rs = 200e3
+
+[limits]
+vi = [ 0.0, 1000000.0,]
+vo = [ 0.0, 1000000.0,]
+ii = [ 0.0, 1000000.0,]
+io = [ 0.0, 1000000.0,]
diff --git a/tests/data/rloss.toml b/tests/data/rloss.toml
new file mode 100644
index 0000000..e4a879a
--- /dev/null
+++ b/tests/data/rloss.toml
@@ -0,0 +1,8 @@
+[rloss]
+rs = 0.030
+
+[limits]
+vi = [ 0.0, 1000000.0,]
+vo = [ 0.0, 1000000.0,]
+ii = [ 0.0, 1000000.0,]
+io = [ 0.0, 1000000.0,]
diff --git a/tests/data/source.toml b/tests/data/source.toml
new file mode 100644
index 0000000..115163b
--- /dev/null
+++ b/tests/data/source.toml
@@ -0,0 +1,9 @@
+[source]
+vo = 3.0
+rs = 0.007
+
+[limits]
+vi = [ 0.0, 1000000.0,]
+vo = [ 0.0, 1000000.0,]
+ii = [ 0.0, 1000000.0,]
+io = [ 0.0, 1000000.0,]
diff --git a/tests/data/vloss.toml b/tests/data/vloss.toml
new file mode 100644
index 0000000..03b161d
--- /dev/null
+++ b/tests/data/vloss.toml
@@ -0,0 +1,8 @@
+[vloss]
+vdrop = 1.7
+
+[limits]
+vi = [ 0.0, 1000000.0,]
+vo = [ 0.0, 1000000.0,]
+ii = [ 0.0, 1000000.0,]
+io = [ 0.0, 1000000.0,]
diff --git a/tests/regression/test_json_v1.py b/tests/regression/test_json_v1.py
new file mode 100644
index 0000000..281eb5a
--- /dev/null
+++ b/tests/regression/test_json_v1.py
@@ -0,0 +1,56 @@
+# MIT License
+#
+# Copyright (c) 2024, Geir Drange
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+import pytest
+import numpy as np
+import pandas as pd
+
+from sysloss.system import System
+from sysloss.components import *
+
+
+def test_case1():
+ """Check system saved to json v1 format"""
+ case1 = System.from_file("tests/data/System v1.0.0.json")
+ df = case1.solve()
+ rows = df.shape[0]
+ assert np.allclose(
+ df[df["Component"] == "System average"]["Power (W)"][rows - 1],
+ 1.826334,
+ rtol=1e-6,
+ ), "Case1 power"
+ assert np.allclose(
+ df[df["Component"] == "System average"]["Loss (W)"][rows - 1],
+ 0.814912,
+ rtol=1e-6,
+ ), "Case1 loss"
+ assert np.allclose(
+ df[df["Component"] == "System average"]["Efficiency (%)"][rows - 1],
+ 54.846542,
+ rtol=1e-6,
+ ), "Case1 efficiency"
+ assert (
+ df[df["Component"] == "System total"]["Warnings"][rows - 2] == "Yes"
+ ), "Case 1 warnings"
+ dfp = case1.params()
+ df_bool = dfp == "interp"
+ assert df_bool.sum().sum() == 4, "Case 1 interp components"
diff --git a/tests/test_sysloss.py b/tests/test_sysloss.py
deleted file mode 100644
index d181d45..0000000
--- a/tests/test_sysloss.py
+++ /dev/null
@@ -1 +0,0 @@
-from sysloss import sysloss
diff --git a/tests/unit/test_comp_arith.py b/tests/unit/test_comp_arith.py
new file mode 100644
index 0000000..0069771
--- /dev/null
+++ b/tests/unit/test_comp_arith.py
@@ -0,0 +1,455 @@
+# MIT License
+#
+# Copyright (c) 2024, Geir Drange
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+import pytest
+import numpy as np
+from sysloss.components import *
+
+# [vi, vo, io, phase]
+INP_CURR_TESTS = [
+ [0.0, 0.0, 1.0, ""],
+ [-0.0, -0.0, 1.0, ""],
+ [-100, -90, 3.14, "Apple"],
+ [10, 5, 0.0, ""],
+ [3.3, 3.0, 1e-3, ""],
+ [-24, -15, 0.0, "Apple"],
+]
+# [vi, ii, io, phase]
+OUTP_VOLT_TESTS = [
+ [0.0, 10, 10, ""],
+ [-0.0, 0, 0, ""],
+ [-15, 0.7, 0.7, ""],
+ [230, 2.1, 2.0, "Apple"],
+ [4.7, 0.0, 0.0, ""],
+]
+# [vi, vo, ii, io, phase]
+PWR_LOSS_TESTS = [
+ [0.0, 0.0, 0.5, 0.6, ""],
+ [-10.0, -8.5, 0.25, 0.1, ""],
+ [-200, 0.0, 0.0, 2, ""],
+ [3.3, 100, 0.1, 1e-3, ""],
+ [24, 0, 14, 0, "Apple"],
+ [-0.0, 0.0, 0.0, 0.0, ""],
+ [48, 48, 5, 4, ""],
+]
+
+
+def close(a, b):
+ """Check if results are close"""
+ return np.allclose([a], [b])
+
+
+@pytest.fixture()
+def source(name, vo, rs):
+ """Return a Source object."""
+ return Source(name, vo=vo, rs=rs)
+
+
+@pytest.mark.parametrize(
+ "name, vo, rs",
+ [("test1", 5.0, 0.0), ("test 2", -12.0, 1.0), ("zero volt", 0.0, 10.0)],
+)
+def test_source(source, name, vo, rs):
+ """Test Source object with different parameters"""
+ assert source._params["name"] == name
+
+ for ict in INP_CURR_TESTS:
+ ii = 0.0 if (vo == 0.0) else ict[2]
+ assert close(
+ source._solv_inp_curr(ict[0], ict[1], ict[2], ict[3]), ii
+ ), "Check Source input current"
+ for ovt in OUTP_VOLT_TESTS:
+ v = 0.0 if (vo == 0.0) else vo - rs * ovt[2]
+ assert close(
+ source._solv_outp_volt(ovt[0], ovt[1], ovt[2], ovt[3]), v
+ ), "Check source output voltage"
+ for plt in PWR_LOSS_TESTS:
+ pwr, loss, eff = source._solv_pwr_loss(plt[0], vo, plt[2], plt[3], plt[4])
+ epwr = abs(vo * plt[3])
+ assert close(pwr, epwr), "Check Source power"
+ eloss = 0.0 if vo == 0.0 else rs * plt[3] * plt[3]
+ assert close(loss, eloss), "Check Source loss"
+ eeff = 100.0 if vo == 0.0 or plt[3] == 0.0 else 100 * (epwr - eloss) / epwr
+ assert close(eff, eeff), "Check Source efficiency"
+
+
+@pytest.fixture()
+def rloss(name, rs):
+ """Return a RLoss object."""
+ return RLoss(name, rs=rs)
+
+
+@pytest.mark.parametrize(
+ "name, rs",
+ [("R pos", 25.0), ("R neg", -1.77), ("R zero", 0.0)],
+)
+def test_rloss(rloss, name, rs):
+ """Test RLoss object with different parameters"""
+ assert rloss._params["name"] == name
+
+ for ict in INP_CURR_TESTS:
+ ii = 0.0 if (ict[0] == 0.0) else ict[2]
+ assert close(
+ rloss._solv_inp_curr(ict[0], ict[1], ict[2], ict[3]), ii
+ ), "Check RLoss input current"
+ for ovt in OUTP_VOLT_TESTS:
+ v = 0.0 if (ovt[0] == 0.0) else ovt[0] - abs(rs) * ovt[2] * np.sign(ovt[0])
+ if np.sign(v) != np.sign(ovt[0]):
+ v = 0.0
+ if ovt[0] == -15 and name == "R pos":
+ with pytest.raises(ValueError):
+ rloss._solv_outp_volt(ovt[0], ovt[1], ovt[2], ovt[3])
+ else:
+ assert close(
+ rloss._solv_outp_volt(ovt[0], ovt[1], ovt[2], ovt[3]), v
+ ), "Check Loss output voltage"
+ for plt in PWR_LOSS_TESTS:
+ pwr, los, eff = rloss._solv_pwr_loss(plt[0], plt[1], plt[2], plt[3], plt[4])
+ vo = plt[0] - (plt[3] * abs(rs)) * np.sign(plt[0])
+ valid = True if np.sign(vo) == np.sign(plt[0]) else False
+ epwr = abs(plt[0] * plt[2]) if valid else 0.0
+ assert close(pwr, epwr), "Check Loss power"
+ eloss = 0.0 if plt[0] == 0.0 or not valid else abs(plt[0] - vo) * plt[3]
+ assert close(los, eloss), "Check RLoss loss"
+ ef = 100.0
+ if epwr > 0.0:
+ ef = 100.0 * abs((epwr - eloss) / epwr)
+ if not valid:
+ ef = 0.0
+ assert close(eff, ef), "Check RLoss efficiency"
+
+
+@pytest.fixture()
+def vloss(name, vdrop):
+ """Return a VLoss object."""
+ return VLoss(name, vdrop=vdrop)
+
+
+@pytest.mark.parametrize(
+ "name, vdrop",
+ [("V pos", 5.0), ("V neg", -1.77), ("V zero", 0.0)],
+)
+def test_vloss(vloss, name, vdrop):
+ """Test VLoss object with different parameters"""
+ assert vloss._params["name"] == name
+
+ for ict in INP_CURR_TESTS:
+ ii = 0.0 if (ict[0] == 0.0) else ict[2]
+ assert close(
+ vloss._solv_inp_curr(ict[0], ict[1], ict[2], ict[3]), ii
+ ), "Check VLoss input current"
+ for ovt in OUTP_VOLT_TESTS:
+ v = 0.0 if (ovt[0] == 0.0) else ovt[0] - abs(vdrop) * np.sign(ovt[0])
+ if np.sign(v) != np.sign(ovt[0]):
+ v = 0.0
+ if ovt[0] == 4.7 and name == "V pos":
+ with pytest.raises(ValueError):
+ vloss._solv_outp_volt(ovt[0], ovt[1], ovt[2], ovt[3])
+ else:
+ assert close(
+ vloss._solv_outp_volt(ovt[0], ovt[1], ovt[2], ovt[3]), v
+ ), "Check VLoss output voltage"
+ for plt in PWR_LOSS_TESTS:
+ pwr, los, eff = vloss._solv_pwr_loss(plt[0], plt[1], plt[2], plt[3], plt[4])
+ vo = plt[0] - abs(vdrop) * np.sign(plt[0])
+ valid = True if np.sign(vo) == np.sign(plt[0]) else False
+ epwr = abs(plt[0] * plt[2]) if valid else 0.0
+ assert close(pwr, epwr), "Check VLoss power"
+ eloss = 0.0 if plt[0] == 0.0 or not valid else abs(plt[0] - vo) * plt[3]
+ assert close(los, eloss), "Check VLoss loss"
+ ef = 100.0
+ if epwr > 0.0:
+ ef = 100.0 * abs((epwr - eloss) / epwr)
+ if not valid:
+ ef = 0.0
+ assert close(eff, ef), "Check VLoss efficiency"
+
+
+@pytest.fixture()
+def pload(name, pwr, pwrs, phase_loads):
+ """Return a PLoad object."""
+ return PLoad(name, pwr=pwr, pwrs=pwrs)
+
+
+@pytest.mark.parametrize(
+ "name, pwr, pwrs, phase_loads",
+ [
+ ("No phase", 0.5, 0.001, {}),
+ ("On-phase", 0.5, 0.1, {"Apple": 0.78}),
+ ("Off-phase", 0.65, 0.13, {"Pear": 0.9}),
+ ],
+)
+def test_pload(pload, name, pwr, pwrs, phase_loads):
+ """Test PLoad object with different parameters"""
+ assert pload._params["name"] == name
+
+ for ict in INP_CURR_TESTS:
+ if phase_loads == {}:
+ p = pwr
+ elif ict[3] in phase_loads:
+ p = phase_loads[ict[3]]
+ else:
+ p = pwrs
+ if ict[0] == 0.0:
+ ii = 0.0
+ else:
+ ii = p / abs(ict[0])
+ assert close(
+ pload._solv_inp_curr(ict[0], ict[1], ict[2], ict[3], phase_loads), ii
+ ), "Check PLoad input current"
+ for ovt in OUTP_VOLT_TESTS:
+ assert (
+ pload._solv_outp_volt(ovt[0], ovt[1], ovt[2], ovt[3], phase_loads) == 0.0
+ ), "Check PLoad output voltage"
+ for plt in PWR_LOSS_TESTS:
+ pwr, loss, eff = pload._solv_pwr_loss(
+ plt[0], plt[1], plt[2], plt[3], plt[4], phase_loads
+ )
+ epwr = 0.0 if plt[0] == 0.0 else abs(plt[0] * plt[2])
+ assert close(pwr, epwr), "Check PLoad power"
+ assert 0.0 == loss, "Check PLoad loss"
+ assert 100.0 == eff, "Check PLoad efficiency"
+
+
+@pytest.fixture()
+def iload(name, ii, iis, phase_loads):
+ """Return a ILoad object."""
+ return ILoad(name, ii=ii, iis=iis)
+
+
+@pytest.mark.parametrize(
+ "name, ii, iis, phase_loads",
+ [
+ ("No phase", 0.5, 0.001, {}),
+ ("On-phase", 0.5, 0.1, {"Apple": 0.78}),
+ ("Off-phase", 0.65, 0.13, {"Pear": 0.9}),
+ ],
+)
+def test_iload(iload, name, ii, iis, phase_loads):
+ """Test ILoad object with different parameters"""
+ assert iload._params["name"] == name
+
+ for ict in INP_CURR_TESTS:
+ if phase_loads == {}:
+ i = ii
+ elif ict[3] in phase_loads:
+ i = phase_loads[ict[3]]
+ else:
+ i = iis
+ if ict[0] == 0.0:
+ i = 0.0
+ assert close(
+ iload._solv_inp_curr(ict[0], ict[1], ict[2], ict[3], phase_loads), i
+ ), "Check ILoad input current"
+ for ovt in OUTP_VOLT_TESTS:
+ assert (
+ iload._solv_outp_volt(ovt[0], ovt[1], ovt[2], ovt[3], phase_loads) == 0.0
+ ), "Check ILoad output voltage"
+ for plt in PWR_LOSS_TESTS:
+ pwr, loss, eff = iload._solv_pwr_loss(
+ plt[0], plt[1], plt[2], plt[3], plt[4], phase_loads
+ )
+ epwr = 0.0 if plt[0] == 0.0 else abs(plt[0] * plt[2])
+ assert close(pwr, epwr), "Check ILoad power"
+ assert 0.0 == loss, "Check ILoad loss"
+ assert 100.0 == eff, "Check ILoad efficiency"
+
+
+@pytest.fixture()
+def rload(name, rs, phase_loads):
+ """Return a RLoad object."""
+ return RLoad(name, rs=rs)
+
+
+@pytest.mark.parametrize(
+ "name, rs, phase_loads",
+ [
+ ("No phase", 12, {}),
+ ("On-phase", 27, {"Apple": 33, "Orange": 47}),
+ ("Off-phase", 150, {"Pear": 190}),
+ ],
+)
+def test_rload(rload, name, rs, phase_loads):
+ """Test RLoad object with different parameters"""
+ assert rload._params["name"] == name
+
+ for ict in INP_CURR_TESTS:
+ if phase_loads == {}:
+ r = rs
+ elif ict[3] in phase_loads:
+ r = phase_loads[ict[3]]
+ else:
+ r = rs
+ if ict[0] == 0.0:
+ i = 0.0
+ else:
+ i = abs(ict[0]) / r
+ assert close(
+ rload._solv_inp_curr(ict[0], ict[1], ict[2], ict[3], phase_loads), i
+ ), "Check RLoad input current"
+ for ovt in OUTP_VOLT_TESTS:
+ assert (
+ rload._solv_outp_volt(ovt[0], ovt[1], ovt[2], ovt[3], phase_loads) == 0.0
+ ), "Check RLoad output voltage"
+ for plt in PWR_LOSS_TESTS:
+ pwr, loss, eff = rload._solv_pwr_loss(
+ plt[0], plt[1], plt[2], plt[3], plt[4], phase_loads
+ )
+ epwr = 0.0 if plt[0] == 0.0 else abs(plt[0] * plt[2])
+ assert close(pwr, epwr), "Check RLoad power"
+ assert 0.0 == loss, "Check RLoad loss"
+ assert 100.0 == eff, "Check RLoad efficiency"
+
+
+@pytest.fixture()
+def converter(name, vo, eff, iq, iis, active_phases):
+ """Return a Converter object."""
+ return Converter(name, vo=vo, eff=eff, iq=iq, iis=iis)
+
+
+@pytest.mark.parametrize(
+ "name, vo, eff, iq, iis, active_phases",
+ [
+ ("No phase", 12.0, 0.97, 1e-5, 1e-6, []),
+ ("On-phase", -15, 0.88, 1.7e-4, 2e-5, ["Apple", "Orange"]),
+ ("Off-phase", 150, 0.5, 1e-3, 1.2e-4, ["Pear"]),
+ ("zero volt", 0.0, 0.65, 3e-3, 1e-4, []),
+ ],
+)
+def test_converter(converter, name, vo, eff, iq, iis, active_phases):
+ """Test Converter object with different parameters"""
+ assert converter._params["name"] == name
+
+ for ict in INP_CURR_TESTS:
+ if ict[0] == 0.0 or vo == 0.0:
+ ii = 0.0
+ elif active_phases == []:
+ if ict[2] == 0.0:
+ ii = iq
+ else:
+ ii = abs(vo * ict[2] / (eff * ict[0]))
+ elif ict[3] in active_phases:
+ if ict[2] == 0.0:
+ ii = iq
+ else:
+ ii = abs(vo * ict[2] / (eff * ict[0]))
+ elif ict[3] not in active_phases:
+ ii = iis
+ assert close(
+ converter._solv_inp_curr(ict[0], ict[1], ict[2], ict[3], active_phases), ii
+ ), "Check Converter input current"
+ for ovt in OUTP_VOLT_TESTS:
+ v = vo
+ if ovt[0] == 0.0 or vo == 0.0:
+ v = 0.0
+ elif active_phases != []:
+ if ovt[3] not in active_phases:
+ v = 0.0
+ assert close(
+ converter._solv_outp_volt(ovt[0], ovt[1], ovt[2], ovt[3], active_phases), v
+ ), "Check Converter output voltage"
+ for plt in PWR_LOSS_TESTS:
+ pwr, loss, ef = converter._solv_pwr_loss(
+ plt[0], vo, plt[2], plt[3], plt[4], active_phases
+ )
+ ipwr = abs(plt[0] * plt[2])
+ eloss = abs(iq * plt[0]) if plt[3] == 0.0 else ipwr * (1.0 - eff)
+ if active_phases != []:
+ if plt[4] not in active_phases:
+ eloss = abs(iis * plt[0])
+ ipwr = abs(iis * plt[0])
+ assert close(pwr, ipwr), "Check Converter power"
+ assert close(loss, eloss), "Check Converter loss"
+ if ipwr == 0.0 or vo == 0.0:
+ eeff = 0.0
+ opwr = ipwr - eloss
+ if ipwr == 0.0:
+ eeff = 0.0
+ else:
+ eeff = 100.0 * abs(opwr / ipwr)
+ assert close(ef, eeff), "Check Converter efficiency"
+
+
+@pytest.fixture()
+def linreg(name, vo, vdrop, iq, iis, active_phases):
+ """Return a LinReg object."""
+ return LinReg(name, vo=vo, vdrop=vdrop, iq=iq, iis=iis)
+
+
+@pytest.mark.parametrize(
+ "name, vo, vdrop, iq, iis, active_phases",
+ [
+ ("No phase", 12.0, 1.2, 1e-5, 1e-6, []),
+ ("On-phase", -15, 0.88, 1.7e-4, 2e-5, ["Apple", "Orange"]),
+ ("Off-phase", 150, 0.67, 1e-3, 1.2e-4, ["Pear"]),
+ ],
+)
+def test_linreg(linreg, name, vo, vdrop, iq, iis, active_phases):
+ """Test LinReg object with different parameters"""
+ assert linreg._params["name"] == name
+
+ for ict in INP_CURR_TESTS:
+ if ict[0] == 0.0 or vo == 0.0:
+ ii = 0.0
+ elif active_phases == []:
+ ii = ict[2] if ict[2] > 0.0 else iq
+ elif ict[3] in active_phases:
+ ii = ict[2] if ict[2] > 0.0 else iq
+ elif ict[3] not in active_phases:
+ ii = iis
+ assert close(
+ linreg._solv_inp_curr(ict[0], ict[1], ict[2], ict[3], active_phases), ii
+ ), "Check Linreg input current"
+ for ovt in OUTP_VOLT_TESTS:
+ v = min(abs(vo), max(abs(ovt[0]) - vdrop, 0.0))
+ if ovt[0] == 0.0 or vo == 0.0:
+ v = 0.0
+ elif active_phases != []:
+ if ovt[3] not in active_phases:
+ v = 0.0
+ assert close(
+ linreg._solv_outp_volt(ovt[0], ovt[1], ovt[2], ovt[3], active_phases),
+ v * np.sign(vo),
+ ), "Check Linreg output voltage"
+ for plt in PWR_LOSS_TESTS:
+ pwr, loss, eff = linreg._solv_pwr_loss(
+ plt[0], vo, plt[2], plt[3], plt[4], active_phases
+ )
+ ipwr = abs(plt[0] * plt[2])
+ v = min(
+ abs(linreg._params["vo"]), max(abs(plt[0]) - linreg._params["vdrop"], 0.0)
+ )
+ eloss = abs(iq * plt[0]) if plt[3] == 0.0 else (abs(plt[0]) - abs(v)) * plt[3]
+ if active_phases != []:
+ if plt[4] not in active_phases:
+ eloss = abs(iis * plt[0])
+ ipwr = abs(iis * plt[0])
+ assert close(pwr, ipwr), "Check LinReg power"
+ assert close(loss, eloss), "Check LinReg loss"
+ if ipwr == 0.0 or v == 0.0:
+ eeff = 0.0
+ opwr = ipwr - eloss
+ if ipwr == 0.0:
+ eeff = 0.0
+ else:
+ eeff = 100.0 * abs(opwr / ipwr)
+ assert close(eff, eeff), "Check LinReg efficiency"
diff --git a/tests/unit/test_components.py b/tests/unit/test_components.py
new file mode 100644
index 0000000..5a06ad5
--- /dev/null
+++ b/tests/unit/test_components.py
@@ -0,0 +1,212 @@
+# MIT License
+#
+# Copyright (c) 2024, Geir Drange
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+
+from sysloss.components import *
+from sysloss.components import _ComponentTypes, _ComponentInterface
+from sysloss.components import LIMITS_DEFAULT
+from sysloss.components import _Interp0d, _Interp1d, _Interp2d
+import numpy as np
+import pytest
+
+
+def close(a, b):
+ """Check if results are close"""
+ return np.allclose([a], [b])
+
+
+def test_classes():
+ """Check informal interface on components"""
+ assert issubclass(Source, _ComponentInterface), "subclass Source"
+ assert issubclass(ILoad, _ComponentInterface), "subclass ILoad"
+ assert issubclass(PLoad, _ComponentInterface), "subclass PLoad"
+ assert issubclass(RLoss, _ComponentInterface), "subclass SLoss"
+ assert issubclass(VLoss, _ComponentInterface), "subclass SLoss"
+ assert issubclass(Converter, _ComponentInterface), "subclass Converter"
+ assert issubclass(LinReg, _ComponentInterface), "subclass LinReg"
+
+
+def test_source():
+ """Check Source component"""
+ sa = Source("Battery 3V", vo=3.0, rs=7e-3)
+ assert sa._component_type == _ComponentTypes.SOURCE, "Source component type"
+ assert _ComponentTypes.SOURCE not in list(sa._child_types), "Source child types"
+ sb = Source.from_file("Battery 3V", fname="tests/data/source.toml")
+ assert sa._params == sb._params, "Source parameters from file"
+ assert sa._limits == sb._limits, "Source limits from file"
+ assert isinstance(sa, _ComponentInterface), "instance Source"
+
+
+def test_pload():
+ """Check PLoad component"""
+ pa = PLoad("Load 1", pwr=27e-3)
+ assert pa._component_type == _ComponentTypes.LOAD, "PLoad component type"
+ assert list(pa._child_types) == [None], "PLoad child types"
+ pb = PLoad.from_file("Load 1", fname="tests/data/pload.toml")
+ assert pa._params == pb._params, "PLoad parameters from file"
+ assert pa._limits == pb._limits, "PLoad limits from file"
+ assert isinstance(pa, _ComponentInterface), "instance PLoad"
+
+
+def test_iload():
+ """Check ILoad component"""
+ ia = ILoad("Load 1", ii=15e-3)
+ assert ia._component_type == _ComponentTypes.LOAD, "ILoad component type"
+ assert list(ia._child_types) == [None], "ILoad child types"
+ ib = ILoad.from_file("Load 1", fname="tests/data/iload.toml")
+ assert ia._params == ib._params, "ILoad parameters from file"
+ assert ia._limits == ib._limits, "ILoad limits from file"
+ assert isinstance(ia, _ComponentInterface), "instance ILoad"
+
+
+def test_rload():
+ """Check RLoad component"""
+ ra = RLoad("Load 1", rs=200e3)
+ assert ra._component_type == _ComponentTypes.LOAD, "RLoad component type"
+ assert list(ra._child_types) == [None], "RLoad child types"
+ rb = RLoad.from_file("Load 1", fname="tests/data/rload.toml")
+ assert ra._params == rb._params, "RLoad parameters from file"
+ assert ra._limits == rb._limits, "RLoad limits from file"
+ assert isinstance(ra, _ComponentInterface), "instance ILoad"
+ with pytest.raises(ValueError):
+ ra = RLoad("Load 1", rs=0.0)
+
+
+def test_rloss():
+ """Check RLoss component"""
+ la = RLoss("RLoss 1", rs=30e-3, limits=LIMITS_DEFAULT)
+ assert la._component_type == _ComponentTypes.SLOSS, "RLoss component type"
+ assert _ComponentTypes.SOURCE not in list(la._child_types), "RLoss child types"
+ lb = RLoss.from_file("RLoss 1", fname="tests/data/rloss.toml")
+ assert la._params == lb._params, "RLoss parameters from file"
+ assert la._limits == lb._limits, "RLoss limits from file"
+ assert isinstance(la, _ComponentInterface), "instance RLoss"
+
+
+def test_vloss():
+ """Check VLoss component"""
+ la = VLoss("VLoss 1", vdrop=1.7, limits=LIMITS_DEFAULT)
+ assert la._component_type == _ComponentTypes.SLOSS, "VLoss component type"
+ assert _ComponentTypes.SOURCE not in list(la._child_types), "VLoss child types"
+ lb = VLoss.from_file("VLoss 1", fname="tests/data/vloss.toml")
+ assert la._params == lb._params, "VLoss parameters from file"
+ assert la._limits == lb._limits, "VLoss limits from file"
+ assert isinstance(la, _ComponentInterface), "instance VLoss"
+ vdata = {"vi": [4.5], "io": [0.1, 0.4, 0.6, 0.9], "vdrop": [[0.3, 0.4, 0.67, 0.89]]}
+ lc = VLoss("Conv 1D", vdrop=vdata)
+ assert close(lc._ipr._interp(0.25, 100), 0.35), "VLoss 1D interpolation"
+ vdata["io"][-1] = 0.59
+ with pytest.raises(ValueError):
+ lc = VLoss("VLoss 1D interpolation, io non-monotonic", vdrop=vdata)
+ vdata = {
+ "vi": [4.5, 12],
+ "io": [0.1, 0.4, 0.6],
+ "vdrop": [[0.3, 0.4, 0.67], [0.4, 0.55, 0.78]],
+ }
+ lc = VLoss("VLoss 2D", vdrop=vdata)
+ assert close(
+ lc._ipr._interp(0.0, 100), vdata["vdrop"][1][0]
+ ), "VLoss 2D interpolation"
+
+
+def test_converter():
+ """Check Converter component"""
+ ca = Converter("Conv 1", vo=5.0, eff=0.87)
+ assert ca._component_type == _ComponentTypes.CONVERTER, "Converter component type"
+ assert _ComponentTypes.SOURCE not in list(ca._child_types), "Converter child types"
+ with pytest.raises(ValueError):
+ cb = Converter("Conv 1", vo=5.0, eff=1.000001)
+ with pytest.raises(ValueError):
+ cb = Converter("Conv 1", vo=5.0, eff=-0.000001)
+ with pytest.raises(ValueError):
+ cb = Converter("Conv 1", vo=5.0, eff=0.0)
+ cb = Converter.from_file("Conv 1", fname="tests/data/converter.toml")
+ assert ca._params == cb._params, "Converter parameters from file"
+ assert ca._limits == cb._limits, "Converter limits from file"
+ assert isinstance(ca, _ComponentInterface), "instance Converter"
+ edata = {"vi": [4.5], "io": [0.1, 0.4, 0.6, 0.9], "eff": [[0.3, 0.4, 0.67, 0.89]]}
+ ca = Converter("Conv 1D", vo=5.0, eff=edata)
+ assert close(ca._ipr._interp(0.25, 100), 0.35), "Converter 1D interpolation"
+ edata["eff"][-1] = 1.1
+ with pytest.raises(ValueError):
+ ca = Converter("Conv 1D interpolation, eff > 1.0", vo=5.0, eff=edata)
+ edata["eff"][-1] = 0.0
+ with pytest.raises(ValueError):
+ ca = Converter("Conv 1D interpolation, eff = 0.0", vo=5.0, eff=edata)
+ edata["io"][-1] = 0.59
+ with pytest.raises(ValueError):
+ ca = Converter("Conv 1D interpolation, io non-monotonic", vo=5.0, eff=edata)
+ edata = {
+ "vi": [4.5, 12],
+ "io": [0.1, 0.4, 0.6],
+ "eff": [[0.3, 0.4, 0.67], [0.4, 0.55, 0.78]],
+ }
+ ca = Converter("Conv 2D", vo=5.0, eff=edata)
+ assert close(
+ ca._ipr._interp(0.0, 100), edata["eff"][1][0]
+ ), "Converter 2D interpolation"
+
+
+def test_linreg():
+ """Check LinReg component"""
+ la = LinReg("LDO 1", vo=2.5, vdrop=0.3, iq=0.0)
+ assert la._component_type == _ComponentTypes.LINREG, "LinReg component type"
+ assert _ComponentTypes.SOURCE not in list(la._child_types), "LinReg child types"
+ with pytest.raises(ValueError):
+ lb = LinReg("LDO 2", vo=1.8, vdrop=2.0)
+ with pytest.raises(KeyError):
+ lb = LinReg.from_file("LDO 1", fname="tests/data/linreg_bad.toml")
+ lb = LinReg.from_file("LDO 1", fname="tests/data/linreg.toml")
+ assert la._params == lb._params, "LinReg parameters from file"
+ assert la._limits == lb._limits, "LinReg limits from file"
+ assert isinstance(la, _ComponentInterface), "instance LinReg"
+
+
+def test_interpolators():
+ """Check interpolators"""
+ interp0d = _Interp0d(0.66)
+ for i in range(10):
+ rng = np.random.default_rng()
+ assert interp0d._interp(rng.random(), rng.random()) == 0.66, "0D interpolator"
+ x = [0.1, 0.5, 0.8, 1.2, 1.7]
+ fx = [0.1, 0.2, 0.3, 0.5, 0.75]
+ interp1d = _Interp1d(x, fx)
+ for i in range(len(x)):
+ assert close(
+ interp1d._interp(x[i], 10 * rng.random()), fx[i]
+ ), "1D interpolator"
+ assert close(interp1d._interp(0, rng.random()), fx[0]), "1D below smallest x"
+ assert close(interp1d._interp(100, rng.random()), fx[-1]), "1D above largest x"
+ x = [0.1, 0.5, 0.9, 0.1, 0.5, 0.9, 0.1, 0.5, 0.9]
+ y = [3.3, 3.3, 3.3, 5.0, 5.0, 5.0, 12, 12, 12]
+ fxy = [0.55, 0.78, 0.92, 0.5, 0.74, 0.83, 0.4, 0.6, 0.766]
+ interp2d = _Interp2d(x, y, fxy)
+ for i in range(len(x)):
+ assert close(interp2d._interp(x[i], y[i]), fxy[i]), "2D interpolator"
+ assert close(interp2d._interp(0.0, 0.0), fxy[0]), "2D interpolator q0"
+ assert close(interp2d._interp(0.0, 5.0), fxy[3]), "2D interpolator q1"
+ assert close(interp2d._interp(0.0, 100.0), fxy[6]), "2D interpolator q2"
+ assert close(interp2d._interp(0.5, 77.0), fxy[7]), "2D interpolator q3"
+ assert close(interp2d._interp(11, 24.7), fxy[8]), "2D interpolator q4"
+ assert close(interp2d._interp(1.7, 5), fxy[5]), "2D interpolator q5"
+ assert close(interp2d._interp(1.7, 0.33), fxy[2]), "2D interpolator q6"
+ assert close(interp2d._interp(0.5, 2.75), fxy[1]), "2D interpolator q7"
diff --git a/tests/unit/test_system.py b/tests/unit/test_system.py
new file mode 100644
index 0000000..dfc4735
--- /dev/null
+++ b/tests/unit/test_system.py
@@ -0,0 +1,369 @@
+# MIT License
+#
+# Copyright (c) 2024, Geir Drange
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+import pytest
+import numpy as np
+import rich
+
+import matplotlib
+from sysloss.system import System
+from sysloss.components import *
+
+
+def test_case1():
+ """Check system consisting of all component types"""
+ case1 = System("Case1 system", Source("3V coin", vo=3, rs=13e-3))
+ case1.add_comp("3V coin", comp=Converter("1.8V buck", vo=1.8, eff=0.87, iq=12e-6))
+ case1.add_comp("1.8V buck", comp=PLoad("MCU", pwr=27e-3))
+ case1.add_comp("3V coin", comp=Converter("5V boost", vo=5, eff=0.91, iq=42e-6))
+ case1.add_comp("5V boost", comp=ILoad("Sensor", ii=15e-3))
+ case1.add_comp(parent="5V boost", comp=RLoss("RC filter", rs=33.0))
+ case1.add_comp(parent="RC filter", comp=VLoss("Diode", vdrop=0.17))
+ case1.add_comp("Diode", comp=LinReg("LDO 2.5V", vo=2.5, vdrop=0.27, iq=150e-6))
+ case1.add_comp("LDO 2.5V", comp=PLoad("ADC", pwr=15e-3))
+ case1.add_comp("5V boost", comp=RLoad("Res divider", rs=200e3))
+ with pytest.raises(RuntimeError):
+ case1.solve(maxiter=1)
+ df = case1.solve(quiet=False)
+ rows = 11
+ assert df.shape[0] == rows, "Case1 solution row count"
+ assert df.shape[1] == 11, "Case1 solution column count"
+ df = case1.solve(tags={"Battery": "small", "Interval": "fast"})
+ assert df.shape[0] == rows, "Case1 solution row count"
+ assert df.shape[1] == 13, "Case1 solution column count"
+ assert np.allclose(
+ df[df["Component"] == "System total"]["Efficiency (%)"][rows - 1],
+ 79.9011,
+ rtol=1e-6,
+ ), "Case1 efficiency"
+ assert (
+ df[df["Component"] == "System total"]["Warnings"][rows - 1] == ""
+ ), "Case 1 warnings"
+ case1.save("tests/unit/case1.json")
+ dfp = case1.params(limits=True)
+ assert len(dfp) == rows - 1, "Case1 parameters row count"
+ t = case1.tree()
+ assert type(t) == rich.tree.Tree, "Case1 tree output"
+ with pytest.raises(ValueError):
+ case1.tree("Dummy")
+ t = case1.tree("5V boost")
+ assert type(t) == rich.tree.Tree, "Case1 subtree output"
+ edata = {"vi": [3.6], "io": [0.1, 0.4, 0.6, 0.9], "eff": [[0.3, 0.4, 0.67, 0.89]]}
+ case1.change_comp(
+ "1.8V buck", comp=Converter("1.8V buck", vo=1.8, eff=edata, iq=12e-6)
+ )
+ dfp = case1.params(limits=False)
+ assert (
+ dfp[dfp.Component == "1.8V buck"]["eff (%)"].tolist()[0] == "interp"
+ ), "Case parameters interpolator"
+
+ # reload system from json
+ case1b = System.from_file("tests/unit/case1.json")
+ df2 = case1b.solve()
+ assert len(df2) == rows, "Case1b solution row count"
+
+ assert np.allclose(
+ df2[df2["Component"] == "System total"]["Efficiency (%)"][rows - 1],
+ df[df["Component"] == "System total"]["Efficiency (%)"][rows - 1],
+ rtol=1e-6,
+ ), "Case1 vs case1b efficiency"
+
+ assert np.allclose(
+ df2[df2["Component"] == "System total"]["Power (W)"][rows - 1],
+ df[df["Component"] == "System total"]["Power (W)"][rows - 1],
+ rtol=1e-6,
+ ), "Case1 vs case1b power"
+
+
+def test_case2():
+ """Check system consisting of only Source"""
+ case2 = System("Case2 system", Source("12V input", vo=12.0))
+ df = case2.solve()
+ assert len(df) == 2, "Case2 solution row count"
+ assert (
+ df[df["Component"] == "System total"]["Efficiency (%)"][1] == 100.0
+ ), "Case2 efficiency"
+
+
+def test_case3():
+ """Check system with negative output converter"""
+ case3 = System("Case3 system", Source("5V USB", vo=5.0))
+ case3.add_comp(
+ "5V USB",
+ comp=Converter("-12V inverter", vo=-12.0, eff=0.88),
+ )
+ case3.add_comp("-12V inverter", comp=RLoss("Resistor", rs=25.0))
+ df = case3.solve()
+ assert len(df) == 4, "Case3 solution row count"
+ assert (
+ df[df["Component"] == "System total"]["Efficiency (%)"][3] == 100.0
+ ), "Case2 efficiency"
+
+
+def test_case4():
+ """Converter with zero input voltage"""
+ case4 = System("Case4 system", Source("0V system", vo=0.0))
+ case4.add_comp("0V system", comp=Converter("Buck", vo=3.3, eff=0.50))
+ df = case4.solve()
+ assert len(df) == 3, "Case4 solution row count"
+
+
+def test_case5():
+ """LinReg with zero input voltage"""
+ case5 = System("Case4 system", Source("0V system", vo=0.0))
+ case5.add_comp("0V system", comp=LinReg("LDO", vo=-3.3))
+ df = case5.solve()
+ assert len(df) == 3, "Case5 solution row count"
+
+
+def test_case6():
+ """Create new system with root as non-Source"""
+ with pytest.raises(ValueError):
+ case6 = System("Case6 system", PLoad("Load", pwr=1))
+
+
+def test_case7():
+ """Add component to non-existing component"""
+ case7 = System("Case7 system", Source("10V system", vo=10.0))
+ with pytest.raises(ValueError):
+ case7.add_comp("5V input", comp=Converter("Buck", vo=2.5, eff=0.75))
+
+
+def test_case8():
+ """Add component with already used name"""
+ case8 = System("Case8 system", Source("10V system", vo=10.0))
+ case8.add_comp("10V system", comp=Converter("Buck", vo=2.5, eff=0.75))
+ with pytest.raises(ValueError):
+ case8.add_comp("10V system", comp=Converter("Buck", vo=2.5, eff=0.75))
+
+
+def test_case9():
+ """Try adding component of wrong type"""
+ case9 = System("Case9 system", Source("10V system", vo=10.0))
+ with pytest.raises(ValueError):
+ case9.add_comp("10V system", comp=Source("5V", vo=5.0))
+
+
+def test_case10():
+ """Change component"""
+ case10 = System("Case10 system", Source("24V system", vo=24.0, rs=12e-3))
+ case10.add_comp("24V system", comp=Converter("Buck", vo=3.3, eff=0.80))
+ case10.change_comp("Buck", comp=LinReg("LDO", vo=3.3))
+ with pytest.raises(ValueError):
+ case10.change_comp("LDO", comp=Source("5V", vo=5.0))
+ with pytest.raises(ValueError):
+ case10.change_comp("24V system", comp=LinReg("LDO2", vo=3.3))
+
+
+def test_case11():
+ """Delete component"""
+ case11 = System("Case11 system", Source("CR2032", vo=3.0))
+ case11.add_comp("CR2032", comp=Converter("1.8V buck", vo=1.8, eff=0.87))
+ case11.add_comp("1.8V buck", comp=PLoad("MCU", pwr=27e-3))
+ case11.del_comp("1.8V buck", del_childs=False)
+ dfp = case11.params()
+ assert len(dfp) == 2, "Case11 parameters row count"
+ with pytest.raises(ValueError):
+ case11.del_comp("CR2032")
+ with pytest.raises(ValueError):
+ case11.del_comp("Non-existent")
+ case11.add_comp("CR2032", comp=Converter("1.8V buck", vo=1.8, eff=0.87))
+ case11.add_comp("1.8V buck", comp=PLoad("MCU2", pwr=27e-3))
+ case11.del_comp("1.8V buck")
+ dfp = case11.params()
+ assert len(dfp) == 2, "Case11 parameters row count"
+
+
+def test_case12():
+ """Warnings"""
+ case12 = System(
+ "Case12 system",
+ Source(
+ "6V",
+ vo=6.0,
+ limits={
+ "ii": [0.0, 0.101],
+ },
+ ),
+ )
+ case12.add_comp("6V", comp=ILoad("Overload", ii=0.1011))
+ df = case12.solve()
+ assert (
+ df[df["Component"] == "System total"]["Warnings"][2] == "Yes"
+ ), "Case 12 warnings"
+
+
+def test_case13():
+ """Multi-source"""
+ case13 = System("Case13 system", Source("3.3V", vo=3.3))
+ case13.add_source(Source("12V", vo=12, limits={"ii": [0, 1e-3]}))
+ case13.add_comp("3.3V", comp=PLoad("MCU", pwr=0.2))
+ case13.add_comp("12V", comp=PLoad("Test", pwr=1.5))
+ with pytest.raises(ValueError):
+ case13.add_source(PLoad("Test2", pwr=1.5))
+ case13.add_source(Source("3.3V aux", vo=3.3))
+ df = case13.solve()
+ assert len(df) == 9, "Case13 solution row count"
+ assert df.shape[1] == 12, "Case13 column count"
+ assert (
+ df[df["Component"] == "System total"]["Warnings"][8] == "Yes"
+ ), "Case 13 total warnings"
+ assert (
+ df[df["Component"] == "Subsystem 12V"]["Warnings"][6] == "Yes"
+ ), "Case 13 Subsystem 12V warnings"
+ case13.save("tests/unit/case13.json")
+ with pytest.raises(ValueError):
+ case13.del_comp("12V", del_childs=False)
+ case13.del_comp("12V")
+ df = case13.solve()
+ assert len(df) == 6, "Case13 solution row count after delete 12V"
+ case13.del_comp("3.3V aux")
+ df = case13.solve()
+ assert len(df) == 3, "Case13 solution row count after delete 3.3V aux"
+ with pytest.raises(ValueError):
+ case13.del_comp("3.3V")
+ # reload case13 from file
+ case13b = System.from_file("tests/unit/case13.json")
+ dff = case13b.solve()
+ assert len(dff) == 9, "Case13 solution row count"
+ assert (
+ dff[dff["Component"] == "System total"]["Warnings"][8] == "Yes"
+ ), "Case 13 total warnings"
+ assert (
+ dff[dff["Component"] == "Subsystem 12V"]["Warnings"][6] == "Yes"
+ ), "Case 13 Subsystem 12V warnings"
+ assert (
+ dff[dff["Component"] == "Subsystem 3.3V"]["Warnings"][5] == ""
+ ), "Case 13 Subsystem 3.3V warnings"
+ dfp = case13b.params()
+ assert dfp.shape[1] == 13, "Case13 parameter column count"
+ phases = {"sleep": 3600, "active": 127}
+ case13b.set_sys_phases(phases)
+ dfp = case13b.phases()
+ assert dfp.shape[1] == 8, "Case13 phases column count"
+
+
+def test_case14():
+ """Zero output source"""
+ case14 = System("Case14 system", Source("0V", vo=0.0))
+ case14.add_comp("0V", comp=PLoad("MCU", pwr=0.2))
+ case14.add_comp("0V", comp=ILoad("Test", ii=0.1))
+ df = case14.solve()
+ assert len(df) == 4, "Case14 solution row count"
+
+
+def test_case15():
+ """Load phases"""
+ case15 = System("Case15 system", Source("5V", vo=5.0))
+ case15.add_comp("5V", comp=Converter("Buck 3.3", vo=3.3, eff=0.88))
+ case15.set_comp_phases("Buck 3.3", phase_conf=["active"])
+ case15.add_comp("5V", comp=LinReg("LDO 1.8", vo=1.8))
+ case15.set_comp_phases("LDO 1.8", phase_conf=["sleep"])
+ case15.add_comp("Buck 3.3", comp=PLoad("MCU", pwr=0.2))
+ case15.set_comp_phases("MCU", phase_conf={"sleep": 1e-6, "active": 0.2})
+ case15.add_comp("LDO 1.8", comp=ILoad("Sensor", ii=1.7e-3))
+ case15.add_comp("LDO 1.8", comp=ILoad("Sensor2", ii=2.7e-3))
+ case15.set_comp_phases("Sensor2", phase_conf={"sleep": 2.7e-3})
+ case15.add_comp("LDO 1.8", comp=ILoad("Sensor2b", ii=1e-3))
+ case15.set_comp_phases("Sensor2b", phase_conf={"active": 1e-3})
+ case15.add_comp("LDO 1.8", comp=PLoad("Sensor3", pwr=1.7e-3))
+ case15.add_comp("5V", comp=PLoad("Sensor3b", pwr=0.05))
+ case15.set_comp_phases("Sensor3b", phase_conf={"active": 0.05})
+ case15.add_comp("LDO 1.8", comp=RLoss("Resistor", rs=10e3))
+ case15.add_comp("LDO 1.8", comp=RLoad("Sensor4", rs=25e3))
+ case15.add_comp("LDO 1.8", comp=RLoad("Sensor5", rs=100e3))
+ case15.set_comp_phases("Sensor5", phase_conf={"active": 45e3})
+ case15.add_comp("5V", comp=Converter("Buck 3.0", vo=3.0, eff=0.83))
+ case15.add_comp("5V", comp=LinReg("LDO 1.5", vo=1.5))
+ with pytest.raises(ValueError):
+ case15.set_comp_phases("Dummy", phase_conf={"active": 45e3})
+ with pytest.raises(ValueError):
+ case15.set_comp_phases("LDO 1.8", phase_conf=123.7)
+ with pytest.raises(ValueError):
+ case15.set_sys_phases({"sleep": 1000})
+ with pytest.raises(ValueError):
+ case15.set_sys_phases({"N/A": 100, "rest": 1})
+ with pytest.raises(ValueError):
+ case15.set_comp_phases("5V", {"active": 45e3})
+ with pytest.raises(ValueError):
+ case15.set_comp_phases("Resistor", {"active": 45e3})
+ assert case15.phases() == None
+ phases = {"sleep": 3600, "active": 127}
+ case15.set_sys_phases(phases)
+ assert phases == case15.get_sys_phases()
+ df = case15.phases()
+ expl = 15
+ assert len(df) == expl, "Case15 phase report length"
+ with pytest.raises(ValueError):
+ case15.solve(phase="unknown")
+ df = case15.solve(phase="sleep")
+ assert len(df) == expl, "Case15 solution row count (one phase)"
+ df = case15.solve(quiet=False)
+ assert len(df) == 2 * expl + 1, "Case15 solution row count (all phases)"
+ df = case15.solve(tags={"Tag1": "one"})
+ assert df.shape[0] == 2 * expl + 1, "Case15 tagged solution row count (all phases)"
+ assert df.shape[1] == 13, "Case15 tagged solution column count (all phases)"
+ df = case15.solve(tags={"Tag1": "one"}, energy=True)
+ assert df.shape[0] == 2 * expl + 1, "Case15 tagged solution row count (all phases)"
+ assert (
+ df.shape[1] == 14
+ ), "Case15 tagged solution column count with energy (all phases)"
+
+
+def test_case16():
+ """Plot interpolation data"""
+ case16 = System("Case16 system", Source("12V", vo=12.0))
+ case16.add_comp("12V", comp=Converter("Buck 5.0", vo=5.0, eff=0.88))
+ with pytest.raises(ValueError):
+ case16.plot_interp("Dummy")
+ assert case16.plot_interp("Buck 5.0") == None, "Case16 - no interpolation data"
+ d1 = {"vi": [3.3], "io": [0.1, 0.5, 0.9], "eff": [[0.55, 0.78, 0.92]]}
+ case16.change_comp("Buck 5.0", comp=Converter("Buck 5.0", vo=5.0, eff=d1))
+ assert (
+ type(case16.plot_interp("Buck 5.0")) == matplotlib.figure.Figure
+ ), "Case16 1D figure"
+ d2 = {
+ "vi": [-3.3, -5.0, -12],
+ "io": [0.1, 0.5, 0.9],
+ "eff": [[0.55, 0.78, 0.92], [0.5, 0.74, 0.83], [0.4, 0.6, 0.766]],
+ }
+ case16.add_comp("12V", comp=Converter("Buck 3.3", vo=3.3, eff=d2))
+ assert (
+ type(case16.plot_interp("Buck 3.3")) == matplotlib.figure.Figure
+ ), "Case16 2D figure"
+ assert (
+ type(case16.plot_interp("Buck 3.3", plot3d=True)) == matplotlib.figure.Figure
+ ), "Case16 3D figure"
+ d1 = {"vi": [3.3], "io": [0.1, 0.5, 0.9], "vdrop": [[0.55, 0.78, 0.92]]}
+ case16.add_comp("12V", comp=VLoss("Diode 1", vdrop=d1))
+ assert (
+ type(case16.plot_interp("Diode 1")) == matplotlib.figure.Figure
+ ), "Case16 Diode 1D figure"
+ d3 = {
+ "vi": [1, 2, 3],
+ "io": [0.1, 0.5, 0.9],
+ "vdrop": [[0.55, 0.78, 0.92], [0.5, 0.74, 0.83], [0.4, 0.6, 0.766]],
+ }
+ case16.add_comp("12V", comp=VLoss("Diode 2", vdrop=d3))
+ assert (
+ type(case16.plot_interp("Diode 2")) == matplotlib.figure.Figure
+ ), "Case16 Diode 2D figure"