Zero issueshttps://git.ligo.org/sean-leavey/zero/-/issues2019-08-06T07:43:37Zhttps://git.ligo.org/sean-leavey/zero/-/issues/47circuit.components broken due to new __repr__ for opamps2019-08-06T07:43:37ZAnchal Guptacircuit.components broken due to new __repr__ for opampsThis is regarding [046001b7](https://git.ligo.org/sean-leavey/zero/commit/046001b737296e5601687e3f5d95bdddd33e3ad0) commit on develop branch.
I think this has broken the representation feature for opamps as you can see in a copy of examp...This is regarding [046001b7](https://git.ligo.org/sean-leavey/zero/commit/046001b737296e5601687e3f5d95bdddd33e3ad0) commit on develop branch.
I think this has broken the representation feature for opamps as you can see in a copy of example2.py attached here.[exampl2-copy.py.ipynb](/uploads/75b01897324ed11c4c0e7c7674bcb8fa/exampl2-copy.py.ipynb)
The error is with using self.poles and self.zeros as boolean object when they are a list. Let me know if this is a bug due to my python environment or you missed something here.Sean LeaveySean Leaveyhttps://git.ligo.org/sean-leavey/zero/-/issues/46Add replace_component, replace_opamp, replace_resistor etc functions2019-08-01T06:48:16ZAnchal GuptaAdd replace_component, replace_opamp, replace_resistor etc functionsI think one of the major benefits of zero over liso is that everything is present as python objects during runtime. This is helpful particularly when someone is designing a circuit and want to be able to change the circuit quickly. Howev...I think one of the major benefits of zero over liso is that everything is present as python objects during runtime. This is helpful particularly when someone is designing a circuit and want to be able to change the circuit quickly. However, for replacing a component, at present we are lacking in having direct simple functions that can do it. Right now, one would need to use remove_component and carefully use add_* functions to add the replaced component. **Suggested new features:**
* We can make functions called replace_opamp, replace_resistor, etc which will do an error check and replace components with the same kind of component only and copying the nodes information.
* We can also have a generic replace_component function which will give an error if apples are changes with oranges but will work as expected when someone says "replace that 'opa827' with 'lt1128'".Sean LeaveySean Leaveyhttps://git.ligo.org/sean-leavey/zero/-/issues/45Support dB scaling in op-amp library2019-07-21T19:23:18ZSean LeaveySupport dB scaling in op-amp libraryLots of `a0` (open loop gain) parameters are defined in decibels in op-amp datasheets, yet the library requires absolute magnitudes. Support parsing of `dB` scales.
This probably requires an overhaul of the `Quantity` class.Lots of `a0` (open loop gain) parameters are defined in decibels in op-amp datasheets, yet the library requires absolute magnitudes. Support parsing of `dB` scales.
This probably requires an overhaul of the `Quantity` class.Sean LeaveySean Leaveyhttps://git.ligo.org/sean-leavey/zero/-/issues/44Make it easier to create and add noise sums to solutions2019-06-27T20:54:12ZSean LeaveyMake it easier to create and add noise sums to solutionsThis is really clunky - make it nicer:
```python
import numpy as np
from zero import Circuit
from zero.components import Node
from zero.data import MultiNoiseDensity
from zero.analysis import AcNoiseAnalysis
if __name__ == "__main__":
...This is really clunky - make it nicer:
```python
import numpy as np
from zero import Circuit
from zero.components import Node
from zero.data import MultiNoiseDensity
from zero.analysis import AcNoiseAnalysis
if __name__ == "__main__":
# 1000 frequencies between 1 Hz to 1 MHz
frequencies = np.logspace(0, 6, 1000)
# Create circuit object.
circuit = Circuit()
# Add components.
circuit.add_capacitor(value="10u", node1="gnd", node2="n1")
circuit.add_resistor(value="430", node1="n1", node2="nm")
circuit.add_resistor(value="43k", node1="nm", node2="nout")
circuit.add_capacitor(value="47p", node1="nm", node2="nout")
circuit.add_library_opamp(model="LT1124", node1="gnd", node2="nm", node3="nout")
# Solve circuit.
analysis = AcNoiseAnalysis(circuit=circuit)
solution = analysis.calculate(frequencies=frequencies, input_type="voltage", node="n1",
sink="nout")
# Create a total sum noise.
sum_noise = list(solution.filter_noise(sinks=["nout"]).values())[0]
solution.add_noise_sum(MultiNoiseDensity(constituents=sum_noise, sink=Node("nout"),
label="Sum"))
# Plot.
solution.plot_noise(sinks=["nout"])
solution.show()
```
Props to Rana.Sean LeaveySean Leaveyhttps://git.ligo.org/sean-leavey/zero/-/issues/42Don't run LISO tests if LISO_ACCESS_TOKEN is not found2019-07-16T07:23:24ZSean LeaveyDon't run LISO tests if LISO_ACCESS_TOKEN is not foundSince LISO is not open source, the project's GitLab CI runner grabs the LISO binary from a private AEI git server using an access token (`LISO_ACCESS_TOKEN`) defined in the private project settings, only accessible to me. This has the si...Since LISO is not open source, the project's GitLab CI runner grabs the LISO binary from a private AEI git server using an access token (`LISO_ACCESS_TOKEN`) defined in the private project settings, only accessible to me. This has the side effect that anyone forking the repository and committing changes will have the validation tests fail out.
Fix this by disabling the validation tests if the token is not found.
(props Anchal Gupta)Sean LeaveySean Leaveyhttps://git.ligo.org/sean-leavey/zero/-/issues/41Option of not plotting in dB units and plotting as loglog2019-06-17T12:06:34ZAnchal GuptaOption of not plotting in dB units and plotting as loglogI noticed that the response plots are always in dB units. It would be good to have an option between plotting semilogx in db units or in loglog plot directly.I noticed that the response plots are always in dB units. It would be good to have an option between plotting semilogx in db units or in loglog plot directly.https://git.ligo.org/sean-leavey/zero/-/issues/40Differentiate between LISO and Zero when using `zero liso --compare`2019-05-08T17:28:01ZSean LeaveyDifferentiate between LISO and Zero when using `zero liso --compare`Plotted functions have same labels. Include the group in the label.Plotted functions have same labels. Include the group in the label.Sean LeaveySean Leaveyhttps://git.ligo.org/sean-leavey/zero/-/issues/38Wrong name (=model) in circuit description2019-01-28T20:11:31ZSebastian SteinlechnerWrong name (=model) in circuit descriptionIf I say
```python
p = LisoInputParser()
p.parse("""
op OP1 LT1028 nopp nopm nout
""")
p.circuit
```
I get the result
```
Circuit with 1 component and 3 nodes
1. LT1028(a0=30.000M, gbw=72.000 MHz, delay=7.5000 ns) [in+=nopp, in-=nopm, ...If I say
```python
p = LisoInputParser()
p.parse("""
op OP1 LT1028 nopp nopm nout
""")
p.circuit
```
I get the result
```
Circuit with 1 component and 3 nodes
1. LT1028(a0=30.000M, gbw=72.000 MHz, delay=7.5000 ns) [in+=nopp, in-=nopm, out=nout, model=LT1028]
```
... but would have expected it to say **OP1**(a0=... ). Somehow, the model ends up in the name field.Sean LeaveySean Leaveyhttps://git.ligo.org/sean-leavey/zero/-/issues/37unsupported operand type(s) for /: 'complex' and 'list' if poles or zeros is ...2019-01-28T20:12:14ZSebastian Steinlechnerunsupported operand type(s) for /: 'complex' and 'list' if poles or zeros is a listHave a look at this code:
```from zero.liso import LisoInputParser
p = LisoInputParser()
p.parse("""
r R1 1k gnd nopm
r R2 1k nopm nout
op OP1 AD829 nopp nopm nout
uinput nopp
freq log 10 10M 1000
uoutput nout
""")
sol = p.solution()
sol...Have a look at this code:
```from zero.liso import LisoInputParser
p = LisoInputParser()
p.parse("""
r R1 1k gnd nopm
r R2 1k nopm nout
op OP1 AD829 nopp nopm nout
uinput nopp
freq log 10 10M 1000
uoutput nout
""")
sol = p.solution()
sol.plot()
```
... throws the following error:
```
/usr/local/lib/python3.6/site-packages/zero/config/components.py in gain(self, frequency)
432 * np.exp(-2j * np.pi * self.delay * frequency)
433 * np.prod(1 + 1j * frequency / self.zeros)
--> 434 / np.prod(1 + 1j * frequency / self.poles))
435
436 def inverse_gain(self, *args, **kwargs):
TypeError: unsupported operand type(s) for /: 'complex' and 'list'
```
... but it works when replacing the AD829 with something that does not have two poles/zeros, but just a single one, e.g. OP27.Sean LeaveySean Leaveyhttps://git.ligo.org/sean-leavey/zero/-/issues/36Test for empty input2018-11-22T20:41:33ZSean LeaveyTest for empty inputTest for empty LISO files / empty parsed string. Right now the error message is "input node(s) must be specified", which is not helpful or indicative of the problem. This is because the parser's circuit builder first adds the input compo...Test for empty LISO files / empty parsed string. Right now the error message is "input node(s) must be specified", which is not helpful or indicative of the problem. This is because the parser's circuit builder first adds the input component, which needs nodes to be defined via `uinput` or `iinput`. The presence of these commands is only checked later, when the circuit is being validated.
Solution might be to store parsed stuff in a dict, and check if this is empty, rather than using class properties - but that's a lot of work.
Example test case:
```python
class InvalidFileTestCase(LisoInputParserTestCase):
"""Voltage output command tests"""
def test_empty_string(self):
"""Test empty file"""
self.parser.parse("")
self.assertRaisesRegex(LisoParserError,
r"no circuit defined",
self.parser.solution)
```Sean LeaveySean Leaveyhttps://git.ligo.org/sean-leavey/zero/-/issues/34Fully implement prescaled computations2019-07-03T08:31:32ZSean LeaveyFully implement prescaled computationsPrescaling was disabled for noise calculations in be3ed92e because it was not compatible with current outputs. In LISO the scaling is more complicated than in Zero, more than just scaling by average resistance. Implement scaling as per t...Prescaling was disabled for noise calculations in be3ed92e because it was not compatible with current outputs. In LISO the scaling is more complicated than in Zero, more than just scaling by average resistance. Implement scaling as per the LISO manual.
Side question: are there examples showing the influence of numerical precision errors with and without scaling?Sean LeaveySean Leaveyhttps://git.ligo.org/sean-leavey/zero/-/issues/33Allow computation of noise current2018-11-18T20:38:17ZSean LeaveyAllow computation of noise currentThe solver actually already calculates this - just needs supported by analysis and solution classes and input and output parsers.The solver actually already calculates this - just needs supported by analysis and solution classes and input and output parsers.Sean LeaveySean Leaveyhttps://git.ligo.org/sean-leavey/zero/-/issues/31Refactor CLI2018-10-28T08:06:48ZSean LeaveyRefactor CLIThe CLI is clunky and abuses objects for what should probably be functional code. Investigate the use of a PyPI library like [click](https://click.palletsprojects.com) or [docopt](https://github.com/docopt/docopt).The CLI is clunky and abuses objects for what should probably be functional code. Investigate the use of a PyPI library like [click](https://click.palletsprojects.com) or [docopt](https://github.com/docopt/docopt).Sean LeaveySean Leaveyhttps://git.ligo.org/sean-leavey/zero/-/issues/30Handle input noise projections2019-07-22T15:20:19ZSean LeaveyHandle input noise projectionsHandle LISO's `inputnoise` command. On the surface, this is simple to do: compute a transfer function from output to input once the noise at the output has been calculated. This, however, requires a few changes to the structure of the `a...Handle LISO's `inputnoise` command. On the surface, this is simple to do: compute a transfer function from output to input once the noise at the output has been calculated. This, however, requires a few changes to the structure of the `analysis` classes that build the circuit matrix.
Currently, `AcSignalAnalysis` and `AcNoiseAnalysis` inherit directly from `BaseAcAnalysis` which provides methods for constructing the circuit matrix. The individual analyses override certain base methods to customise the behaviour (for example, the noise analysis transposes the matrix). The `solve` method of `BaseAcAnalysis` is what iterates over the frequency vector, calculating the result by calling the child method, and this is probably the right place to keep this: future features like adaptive frequency steps can be implemented here to be available to all analyses. However, this also means that for `inputnoise` the noise analysis cannot calculate a transfer function to project the output noise to the input without creating a new `AcSignalAnalysis`. Since the analyses take many input parameters, some of which affect the behaviour of code elsewhere (for example, some test code requires that `prescale` be turned off), the noise analysis would have to ensure that the new signal analysis object were instantiated with the same signature it was itself created with. This is liable to introduce bugs if the signature of either analysis were later changed.
A better idea would be to subclass the noise analysis from the signal analysis. In any case, the noise analysis shares a lot of code with the signal analysis, which was originally what motivated the common `BaseAcAnalysis` parent. Instead, the signal analysis could provide all necessary code for the signal analysis (i.e. merge in the `BaseAcAnalysis` methods), perhaps leaving an abstract `solve` method in `BaseAcAnalysis`. The noise analysis can override the relevant parts of the signal analysis, *without* changing any of the signal analysis parts. Then, for input noise calculations, it can simply call the signal analysis methods directly.
Loose list of code changes required:
1. Remove noise input type. This abstraction was short sighted, given that `inputnoise` analysis needs to know if the input is a current or voltage source (whereas other noise analyses didn't care). Remember to replace any uses of the noise input in examples, tests and documentation.
2. Make noise analysis a subclass of signal analysis. Rename/move methods defined in `BaseAcAnalysis`, but keep it around to implement `solve`.
3. Implement `inputnoise` behaviour. This might simply require calling `super().solve()` or similar from within the overridden noise method.
4. Update data classes: set noise spectrum legend label appropriately when noise is referred to some other point.
5. Implement `inputnoise` parsing in `liso` subpackage and add tests.
Optional: allow projection to arbitrary nodes/components, not just input. Would require changing input component on-the-fly? Or just set the RHS vector?Sean LeaveySean Leaveyhttps://git.ligo.org/sean-leavey/zero/-/issues/27LISO output file is still parsed when --liso-plot is provided as part of a li...2018-09-21T13:12:28ZSean LeaveyLISO output file is still parsed when --liso-plot is provided as part of a liso-external callThe `liso-external` subcommand can be provided with the flag `--liso-plot` to let LISO handle plotting with gnuplot instead of parsing the output and showing it with Matplotlib; however, `circuit` still attempts to parse the output file ...The `liso-external` subcommand can be provided with the flag `--liso-plot` to let LISO handle plotting with gnuplot instead of parsing the output and showing it with Matplotlib; however, `circuit` still attempts to parse the output file anyway, as evidenced from running the following example on a pre-`m` commit (e.g. fc5ddd90878987d1fb650340c04479f755b026c1):
```
r r1 1k n1 n2
l l1 10u n2 gnd
l l2 40u n3 gnd # winding ratio 1:2
m m1 .95 l1 l2
r r2 1k n3 gnd
freq log 1 1M 1000
uinput n1
uoutput n3
```Sean LeaveySean Leaveyhttps://git.ligo.org/sean-leavey/zero/-/issues/25Build better op-amp library data structure2018-12-05T19:52:41ZSean LeaveyBuild better op-amp library data structureUsing `ConfigParser` is a bit limited, especially if op-amps and resistors will have arbitrary spectra (see #24). Look into using YAML or similar to represent the data.Using `ConfigParser` is a bit limited, especially if op-amps and resistors will have arbitrary spectra (see #24). Look into using YAML or similar to represent the data.Sean LeaveySean Leaveyhttps://git.ligo.org/sean-leavey/zero/-/issues/21Error No module named 'circuit.liso' on fresh install2019-06-01T15:54:16ZAndrew WadeError No module named 'circuit.liso' on fresh installHey,
I managed to install using pip two days ago and it seemed to work fine. Now I am having issues on fresh pip install into a clean virtual environment.
When I run basic
```bash
$ circuit --help
```
I get errors importing module c...Hey,
I managed to install using pip two days ago and it seemed to work fine. Now I am having issues on fresh pip install into a clean virtual environment.
When I run basic
```bash
$ circuit --help
```
I get errors importing module circuit.liso . My python version is 3.6.5 inside the environment.
I've copy-pasted the prompt below in case this helps.
```bash
awade@Deep-Thought:~/Git/electronics$ python3 -m venv env
awade@Deep-Thought:~/Git/electronics$ . env/bin/activate
(env) Deep-Thought:electronics awade$ pip install --upgrade pip
Collecting pip
Using cached https://files.pythonhosted.org/packages/0f/74/ecd13431bcc456ed390b44c8a6e917c1820365cbebcb6a8974d1cd045ab4/pip-10.0.1-py2.py3-none-any.whl
Installing collected packages: pip
Found existing installation: pip 9.0.3
Uninstalling pip-9.0.3:
Successfully uninstalled pip-9.0.3
Successfully installed pip-10.0.1
(env) Deep-Thought:electronics awade$ pip --no-cache-dir install git+https://git.ligo.org/sean-leavey/circuit.git
Collecting git+https://git.ligo.org/sean-leavey/circuit.git
Cloning https://git.ligo.org/sean-leavey/circuit.git to /private/var/folders/28/469h9x852jj_lyf_td5xyptc0000gp/T/pip-req-build-r816i2aj
Collecting numpy (from circuit.py==0.4.1)
Downloading https://files.pythonhosted.org/packages/f6/cd/b2c50b5190b66c711c23ef23c41d450297eb5a54d2033f8dcb3b8b13ac85/numpy-1.14.5-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (4.7MB)
100% |████████████████████████████████| 4.7MB 434kB/s
Collecting scipy (from circuit.py==0.4.1)
Downloading https://files.pythonhosted.org/packages/a0/b6/70bf61c1badb5fea82d4c558e05e76c2dee5e77bb072fe465d7c7a87287d/scipy-1.1.0-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (16.7MB)
100% |████████████████████████████████| 16.7MB 1.5MB/s
Collecting matplotlib (from circuit.py==0.4.1)
Downloading https://files.pythonhosted.org/packages/8a/d5/5337662b714c65100f3545ed3909e9478614d1ebf1f692a52981f3f5167b/matplotlib-2.2.2-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (13.7MB)
100% |████████████████████████████████| 13.7MB 1.5MB/s
Collecting progressbar2 (from circuit.py==0.4.1)
Downloading https://files.pythonhosted.org/packages/4f/6f/acb2dd76f2c77527584bd3a4c2509782bb35c481c610521fc3656de5a9e0/progressbar2-3.38.0-py2.py3-none-any.whl
Collecting appdirs (from circuit.py==0.4.1)
Downloading https://files.pythonhosted.org/packages/56/eb/810e700ed1349edde4cbdc1b2a21e28cdf115f9faf263f6bbf8447c1abf3/appdirs-1.4.3-py2.py3-none-any.whl
Collecting tabulate (from circuit.py==0.4.1)
Downloading https://files.pythonhosted.org/packages/12/c2/11d6845db5edf1295bc08b2f488cf5937806586afe42936c3f34c097ebdc/tabulate-0.8.2.tar.gz (45kB)
100% |████████████████████████████████| 51kB 1.5MB/s
Collecting ply (from circuit.py==0.4.1)
Downloading https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl (49kB)
100% |████████████████████████████████| 51kB 884kB/s
Collecting six>=1.10 (from matplotlib->circuit.py==0.4.1)
Downloading https://files.pythonhosted.org/packages/67/4b/141a581104b1f6397bfa78ac9d43d8ad29a7ca43ea90a2d863fe3056e86a/six-1.11.0-py2.py3-none-any.whl
Collecting pytz (from matplotlib->circuit.py==0.4.1)
Downloading https://files.pythonhosted.org/packages/dc/83/15f7833b70d3e067ca91467ca245bae0f6fe56ddc7451aa0dc5606b120f2/pytz-2018.4-py2.py3-none-any.whl (510kB)
100% |████████████████████████████████| 512kB 646kB/s
Collecting python-dateutil>=2.1 (from matplotlib->circuit.py==0.4.1)
Downloading https://files.pythonhosted.org/packages/cf/f5/af2b09c957ace60dcfac112b669c45c8c97e32f94aa8b56da4c6d1682825/python_dateutil-2.7.3-py2.py3-none-any.whl (211kB)
100% |████████████████████████████████| 215kB 193kB/s
Collecting pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 (from matplotlib->circuit.py==0.4.1)
Downloading https://files.pythonhosted.org/packages/6a/8a/718fd7d3458f9fab8e67186b00abdd345b639976bc7fb3ae722e1b026a50/pyparsing-2.2.0-py2.py3-none-any.whl (56kB)
100% |████████████████████████████████| 61kB 350kB/s
Collecting kiwisolver>=1.0.1 (from matplotlib->circuit.py==0.4.1)
Downloading https://files.pythonhosted.org/packages/fb/96/619db9bf08f652790fa9f3c3884a67dc43da4bdaa185a5aa2117eb4651e1/kiwisolver-1.0.1-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (108kB)
100% |████████████████████████████████| 112kB 368kB/s
Collecting cycler>=0.10 (from matplotlib->circuit.py==0.4.1)
Downloading https://files.pythonhosted.org/packages/f7/d2/e07d3ebb2bd7af696440ce7e754c59dd546ffe1bbe732c8ab68b9c834e61/cycler-0.10.0-py2.py3-none-any.whl
Collecting python-utils>=2.3.0 (from progressbar2->circuit.py==0.4.1)
Downloading https://files.pythonhosted.org/packages/eb/a0/19119d8b7c05be49baf6c593f11c432d571b70d805f2fe94c0585e55e4c8/python_utils-2.3.0-py2.py3-none-any.whl
Requirement already satisfied: setuptools in ./env/lib/python3.6/site-packages (from kiwisolver>=1.0.1->matplotlib->circuit.py==0.4.1) (39.0.1)
Installing collected packages: numpy, scipy, six, pytz, python-dateutil, pyparsing, kiwisolver, cycler, matplotlib, python-utils, progressbar2, appdirs, tabulate, ply, circuit.py
Running setup.py install for tabulate ... done
Running setup.py install for circuit.py ... done
Successfully installed appdirs-1.4.3 circuit.py-0.4.1 cycler-0.10.0 kiwisolver-1.0.1 matplotlib-2.2.2 numpy-1.14.5 ply-3.11 progressbar2-3.38.0 pyparsing-2.2.0 python-dateutil-2.7.3 python-utils-2.3.0 pytz-2018.4 scipy-1.1.0 six-1.11.0 tabulate-0.8.2
(env) Deep-Thought:electronics awade$ circuit --help
Traceback (most recent call last):
File "/Users/awade/Git/electronics/env/bin/circuit", line 11, in <module>
load_entry_point('circuit.py==0.4.1', 'console_scripts', 'circuit')()
File "/Users/awade/Git/electronics/env/lib/python3.6/site-packages/pkg_resources/__init__.py", line 480, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File "/Users/awade/Git/electronics/env/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2693, in load_entry_point
return ep.load()
File "/Users/awade/Git/electronics/env/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2324, in load
return self.resolve()
File "/Users/awade/Git/electronics/env/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2330, in resolve
module = __import__(self.module_name, fromlist=['__name__'], level=0)
File "/Users/awade/Git/electronics/env/lib/python3.6/site-packages/circuit/__main__.py", line 11, in <module>
from .liso import LisoInputParser, LisoOutputParser, LisoRunner, LisoParserError
ModuleNotFoundError: No module named 'circuit.liso'
```
Not sure what is going on here as it worked the first time I tried it. I've also tried it on my MacMini to see if it was an issue with my local setup on my laptop. Reproduced the same error.https://git.ligo.org/sean-leavey/zero/-/issues/20Separate circuit definition and analysis-specific code2018-11-22T21:49:46ZSean LeaveySeparate circuit definition and analysis-specific code`Component` objects shouldn't implement the equations used by `AcSignalAnalysis` and `AcNoiseAnalysis`. Instead these should be provided by a mixin to these analyses. This leaves the components free to be used by other analyses without h...`Component` objects shouldn't implement the equations used by `AcSignalAnalysis` and `AcNoiseAnalysis`. Instead these should be provided by a mixin to these analyses. This leaves the components free to be used by other analyses without having to have every component implement the required methods of every analysis, and easily allows for other analyses (e.g. op-amp stability) to implement their own component-specific code without polluting the component's namespace.Sean LeaveySean Leaveyhttps://git.ligo.org/sean-leavey/zero/-/issues/19Allow SI units in uinput/iinput impedance parameter2018-06-15T07:35:44ZSebastian SteinlechnerAllow SI units in uinput/iinput impedance parameterE.g., `iinput nin 10M` does not work, as it is currently parsed as float. Should use SIFormatter.parse() instead?
And just a small note, the docstring for SIFormatter.parse() says that it returns a float, but instead it returns a tuple.E.g., `iinput nin 10M` does not work, as it is currently parsed as float. Should use SIFormatter.parse() instead?
And just a small note, the docstring for SIFormatter.parse() says that it returns a float, but instead it returns a tuple.Sean LeaveySean Leaveyhttps://git.ligo.org/sean-leavey/zero/-/issues/18Parser doesn't throw an error if the same components are added multiple times2018-06-11T21:30:07ZSean LeaveyParser doesn't throw an error if the same components are added multiple times```python
from circuit.liso import LisoInputParser
p = LisoInputParser()
p.parse("r r1 10k n1 n2")
p.parse("r r1 10k n1 n2")
```
...doesn't throw an error.```python
from circuit.liso import LisoInputParser
p = LisoInputParser()
p.parse("r r1 10k n1 n2")
p.parse("r r1 10k n1 n2")
```
...doesn't throw an error.Sean LeaveySean Leavey