novaad


Namenovaad JSON
Version 0.1.6 PyPI version JSON
download
home_pageNone
SummaryAn Analog/Mixed-Signal IC design tool based on the Gm/Id method.
upload_time2024-09-13 08:15:24
maintainerNone
docs_urlNone
authordasdias
requires_python<4.0,>=3.11
licenseBSD-2
keywords analog mixed-signal ic design gm/id eda-cad
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # novaad
### Gm/Id Analog/Mixed-Signal IC Design Tool

This tool is inspired in [Prof. B. Mumman's Gm/Id CAD tool/book](https://github.com/bmurmann/Book-on-gm-ID-design/tree/main/starter_kit), also providing support for interpolation upon look-up. This tool extends the former by being deployed as a Python library, providing an API as well as a CLI that can both be used to perform analog IC design.

<div>
<img align=center width=500 src=./docs/figs/eqs.png>
</img>
</div>

The tool can be used with the Gm/Id method in a forward modelling problem:
  - Given: 
    - A DC operating point (e.g., vgs, vds, vsb, ids),
    - A target drain current (ids) or transconductance (gm),
    - A target Gm/Id ratio (encoding inversion region information), and a channel length (lch) (encoding intirnsic gain (Gm/Gds) and maximum operating frequency information (Gm/Cgg))
  - Optain the device width (w) that satisfies the target Gm/Id ratio for the given DC-OP.
If Vgs is not provided, it will also be targetted as an output design parameter to achieve the target Gm/Id ratio.

The tool can also be used in a reverse modelling problem:
  - Given:
    - A DC operating point (vgs, vds, vsb, ids),
    - A device width (w),
    - A channel length (lch),
  - Obtain the electrical characteristics of the device (e.g., gm, gds, cgg, cgs, cgd, etc.)

Note that this tool doesn't take into account the effect of number of fingers right now. This is a feature that will be added in the future.

## 1. Installation

Install as a normal Python package from PyPI:

```bash
pip install novaad
```

## 2. Usage

There are a sequence of steps required to use the tool:
1. Extract the Look-Up Table (LUT) for each NMOS and PMOS device in the technology of interest. 
   1. Example Cadence Ocean scripts are provided in my['cadence-scripts'](https://github.com/das-dias/cadence_workflow/tree/master/cadence-scripts/gmid) directory to extract the LUTs.

2. Make sure the LUTs are provided in ```.csv``` format.
   1. The LUTs should follow the same exact naming convention used in the Cadence Ocean scripts pointed above but without the device type extension (e.g., ```nmos: _n``` or ```pmos: _p```).
   
   2. For both NMOS and PMOS devices, Gate-Source Voltage (Vgs), Drain-Source Voltage (Vds), Source-Bulk (Vsb) and Drain-Source Current (Ids) should be provided in the LUTs with the naming: ```vgs, vds, vsb, ids```.

### *2.1. API*

The CLI is supported by a flexible Python library that can be used from a Python script. The following example shows how to use the library to perform the Gm/Id design:

```python
# Create a Device instance object
device = Device(
        "./test/data/test_nch_lut_renamed.csv",
        device_type="nch",
)

# Perform a customized LUT lookup:

output_cols = ["av", "jd", "ft"]
target = { # all lists must have the same length
    "vgs": [device.lut["vgs"].mean()],
    "vds": [0.9],
    "vsb": [0.0],
    "lch": [device.lut["lch"].min() * 1],
    "gmoverid": [10.0],
}

kwargs = { # interp_method: "pchip" (default), see Pandas.DataFrame.interpolate for more options
    "interp_method": "nearest",
    "interp_mode": "default",
}
row = device.look_up(output_cols,targetreturn_xy=True, **kwargs)

print(row)
""" row ( as Pandas.DataFrame )
Output: 

            lch  gmoverid  vgs       jd  vsb            ft       av  vds
1  1.800000e-07     8.909  0.7  35.1764  0.0  2.680000e+10  38.6127  0.9
"""

# Perform a Gm/Id sizing operation for a given device:

sizing_spec = DeviceSizingSpecification(
    vgs=0.5, vds=0.6, vsb=0.0, lch=device.lut["lch"].min(), gmoverid=10.0, gm=1e-3
)
sizing = device.sizing(sizing_spec)
print(sizing.to_df())
""" sizing ( as Pandas.DataFrame )
Output:
            lch       wch
0  1.800000e-07  0.000004
"""
```

It is important to note that during lookup, and contrary to ```gmoverid```, ```vgs``` is not prioritized as a target. Vgs should be chosen accordingly to the level of inversion we want for our device. As such, upon computing the closest rows and performing interpolation (the two main operations behind interpolating look up) might lead to a slightly different DC Operating Point in order to achieve the targetted Gm/Id spec along with the VDS, Lch and VSB simultaneously.

This API effectively enables the user to fit the tool into an optimization loop to perform automatic sizing of whole circuits like OTA's, filters, buffers, etc.

### *2.2. CLI*



After extracting the LUT's, create a configuration file using ```.yaml``` format with the following structure:
  

```yaml
# example_config.yaml

nch:
  lut_path: path/to/nmos_lut.csv
  ref_width: 10e-6 # Constant width used to extract the LUT

pch:
  lut_path: path/to/pmos_lut.csv
  ref_width: 10e-6 # Constant width used to extract the LUT

```

This configuration file can be parsed to the CLI to under the ```--config``` flag. Alternatively, you can create a configuration file with the default name ```novaad.cfg.yml``` in the same directory as the CLI is being executed and the tool will automatically load it without the need to specify the ```--config``` flag.

As of ```v.0.1.2``` the tool supports ```.csv``` and ```.h5``` (HDF5 binary) file formats for a more efficient LUT memory storage and readout. The tool will automatically detect the file format and load the LUTs accordingly.


After creating the configuration file and creating the LUTs, you are finally able to use the CLI to perform the Gm/Id design.

* **Help**

```bash
# Input:
$ novaad --help
```

```bash
# Output:
novaad

LUT-based Analog/Mixed-Signal IC Design Tool using Gm/Id Methodology.
    
Usage:
  novaad (device | moscap | switch ) -i=INPUT_FILE [-o=OUTPUT_FILE] [--noise] [--gui] [--verbose] [--config=CONFIG_FILE]
  novaad --gui --type=TYPE [--vds=VSB --vsb=VSB --lch-plot LCH_PLOT ...] [--config=CONFIG_FILE]
  novaad (-h | --help)
  novaad --version
  novaad COMMAND_FILE

Options:
  -h --help                   Show this screen.
  --version                   Show version.
  -i, --input=INPUT_FILE      Input file.
  -o, --output=OUTPUT_FILE    Output file.
  COMMAND_FILE                File with commands to run.
  --gui                       Launch GUI.
  --vds=VDS                   Drain-to-Source Voltage. Default value is LUT mean.
  --vsb=VSB                   Bulk-to-Source Voltage. Default value is LUT minimum.
  --type=TYPE                 Device Type [default: 'nch'].
  --lch-plot                  Channel lengths to include in plot [default: 'all'].
  --noise                     Include noise summary in the analysis.
  --verbose                   Verbose Output.
  --config=CONFIG_FILE        Configuration file [default: 'cfg.yml'].

```

* **Input file:**


To use ```novaad```'s design capabilities, you must specify your design targets in an input ```.toml``` file. An example of such file is shown below:

```toml
# example_input.toml
[device]
m0 = { type = "nch", vds = 0.5, vsb = 0.0, lch = 180e-9, gmid = 26, gm = 1e-3 }
m1 = { type = "pch", vgs = 0.8, vds = 1.3, vsb = 0.0, lch = 180e-9, gmid = 23, gm = 1e-3 } # No output generated for this device; there is no LUT
m2 = { type = "nch" , vgs = 0.8, vds = 0.5, vsb = 0.0, lch = 180e-9, gmid = 10, ids = 500e-6 }
m3 = { type = "nch" , vgs = 0.8, vds = 0.5, vsb = 0.0, lch = 1e-6, wch = 12e-6, ids = 100e-6 }

[noise]
m0 = {t_celsius = 36, noise_fmax = 100e6, flicker_corner_freq=30e3}

# the current test lut doesn't support vsb above 0.0
[moscap]
m4 = { type = "nch", vgs = 0.8, vds = 0.5, vsb = 0.0, lch = 180e-9, cgg = 1.2e-15 } # vds is ignored and set to minimum in LUT table
m5 = { type = "pch", vgs = 0.8, vds = 1.3, vsb = 0.0, lch = 180e-9, cgg = 1.2e-15 } # No output due to no LUT!
m6 = { type = "nch", vgs = 0.8, vsb = 0.0, lch = 180e-9, cgg = 1e-14 }
m7 = { type = "nch", vgs = 0.8, vsb = 0.0, lch = 1e-6, cgg = 1e-14 }
m8 = { type = "nch", vgs = 0.8, vsb = 0.0, lch = 1e-6, wch = 12e-6 } # if wch is parsed, cgg is ignored

[switch]
m9 = { type = "nch", vgs = 1.8, vds = 0.5, vsb = 0.0, lch = 180e-9, ron = 10 } # vds is ignored and set to minimum in LUT table
m10 = { type = "pch", vgs = 0.8, vds = 1.3, vsb = 0.0, lch = 180e-9, ron = 10 } # No output due to no LUT!
m11 = { type = "nch", vgs = 0.8, vsb = 0.0, lch = 180e-9, ron = 10 }
m12 = { type = "nch", vgs = 0.8, vsb = 0.0, lch = 180e-9, ron = 10 }
m13 = { type = "nch", vgs = 0.8, vsb = 0.0, lch = 1e-6, ron = 10 }
m14 = { type = "nch", vgs = 0.8, vsb = 0.0, lch = 1e-6, wch = 12e-6 } # if wch is parsed, ron is ignored
```

The input file is separated in four sections:
1. **Device:** This section is used to specify the design targets for the Gm/Id design of transconductor devices. The following parameters are required:
   - ```type```: Device type (```nch``` or ```pch```).
   - ```vgs```: Gate-to-Source Voltage.
   - ```vds```: Drain-to-Source Voltage.
   - ```vsb```: Bulk-to-Source Voltage.
   - ```lch```: Channel Length.
   - ```gmid```: Target Gm/Id ratio.
   - ```gm```: Target transconductance.
   - ```ids```: Target drain current.
   - ```wch```: Channel Width (optional).

2. **Noise:** This section is used to specify the parameters to perform a simple model-based computation of the steady-state thermal and flicker noise for ```device``` instances (**ONLY DEVICE**). The following parameters are required:
   - ```t_celsius```: Temperature in Celsius.
   - ```noise_fmax```: Maximum frequency for noise analysis.
   - ```flicker_corner_freq```: Flicker noise corner frequency.

NOTE: To ignore flicker just set ```flicker_corner_freq = 0.0```.

3. **Moscap:** This section is used to specify the design targets for the Gm/Id design of MOSCAP devices. The following parameters are required:
   - ```type```: Device type (```nch``` or ```pch```).
   - ```vgs```: Gate-to-Source Voltage.
   - ```vds```: Drain-to-Source Voltage.
   - ```vsb```: Source-to-Bulk Voltage.
   - ```lch```: Channel Length.
   - ```cgg```: Target total-gate capacitance.

4. **Switch:** This section is used to specify the design targets for the Gm/Id design of Switch devices. The following parameters are required:
    - ```type```: Device type (```nch``` or ```pch```).
    - ```vgs```: Gate-to-Source Voltage.
    - ```vds```: Drain-to-Source Voltage.
    - ```vsb```: Source-to-Bulk Voltage.
    - ```lch```: Channel Length.
    - ```ron```: Target on-resistance.

NOTE 2: The ```vds``` parameter is ignored for MOSCAP and SWITCH devices and set to the minimum value in the LUT table (ideally, will be set to ```0.0 V``` if such simulation space is included in the LUTs).

By specifing ```device```, ```moscap``` or ```switch``` in the CLI, the tool will perform the Gm/Id design for the corresponding instances in each section of the input file. 

An example:

```bash
# Input:
$ novaad device -i=path/to/example_input.toml --config=path/to/example_config.yaml
```

```bash
# Output:
(novaad-py3.11) ➜  novaad git:(master) ✗ novaad device --gui -i/Users/dasdias/Documents/ICDesign/cadence_workflow/test/test_input.toml
.../novaad/novaad/__main__.py:166: UserWarning: No configuration found for pch.
  warn(f'No configuration found for {spec.device_type.value}.')

Device Sizing Results:
  Type  ID Vgs [V] Vds [V] Vsb [V] Wch [um] Lch [um]  Cgg [fF]  ...    Gm/Id    Gm [uS] Gds [uS]  Av [V/V]  Av [dB] Ft [GHz] FOM Av*Ft [GHz] FOM NBW [GHz/V]
0  nch  m0    0.80    0.50    0.00  33.8682   0.1800  109.9022  ...  23.6611   411.4982   6.0861  143.0626  43.1105   0.9885        141.4173         23.3890
0  nch  m2    0.80    0.50    0.00  65.8263   0.1800  314.6496  ...   9.9727  4986.3410  50.6533  107.3693  40.6176   2.5250        271.1076         25.1810
0  nch  m3    0.80    0.50    0.00  12.0000   1.0000   68.4000  ...   8.9520   895.2000   7.6440  126.4365  42.0374   2.2800        288.2752         20.4106

[3 rows x 22 columns]
```


* **GUI**
  
The GUI can be launched in two modes of operation:

1. Giving the ```--gui``` flag and specifying the type of device (```nch``` or ```pch```) to the graphs required to perform the Gm/Id design.
   1. The channel lengths to include in the plot can also be specified using the ```--lch-plot``` flag.

Example:

```bash
# Input:
$ novaad --gui --type=nch --config=path/to/example_config.yaml
```
<div>
<img align=center width=700 src=./docs/figs/gui_mode1.png>
</img>
</div>



2. Giving the ```--gui``` flag and specifying the input file with the design targets. This will open a GUI page containing the result tables for the design targets specified in the input file.

Example:

```bash
# Input:
$ novaad device --gui -i=path/to/example_input.toml --config=path/to/example_config.yaml
```

<div>
<img align=center width=700 src=./docs/figs/device.png>
</img>
</div>

## 3. Dependencies

This project was developed using a Python 3.11 virtual environment. The following dependencies are required:

```bash
# requirements.txt
numpy:    pip install numpy
pandas:   pip install pandas
pyyaml:   pip install pyyaml
plotly:   pip install plotly
docopt:   pip install docopt
scipy:    pip install scipy
pydantic: pip install pydantic
confz:    pip install confz
toml:     pip install toml
```

I recommend the creation of a [Python virtual environment](https://docs.python.org/3/library/venv.html) in the folder in which you want to [setup](https://python.land/virtual-environments/virtualenv) this tool.

```bash
# Create a virtual environment on the current directory 
# inside a folder named 'venv'

$ python -m venv venv

# Activate the virtual environment
$ source ./venv/bin/activate

# Install tool
$ pip install novaad
```

If you are using Windows 10 or above, consider using the [Windows Subsystem for Linux (WSL)](https://docs.microsoft.com/en-us/windows/wsl/install) to run the tool. It will make your life easier as no dedicated Windows support is provided for now.

## 4. License

This project is licensed under the [BSD 2-Clause License](https://opensource.org/license/bsd-2-clause) - see the [LICENSE](./LICENSE) file for details.

## 5. Contributing

For now, the only maintainer of this project is the author (me). If you want to contribute, please contact me at ```das.dias@campus.fct.unl.pt``` or ```ddias@tudelft.nl```.

## 6. Acknowledgements

* Prof. João Goes - Reverse usage mode of the Gm/Id method for getting the electrical characteristics of the device from sizing and DC-OP information.

* [Positive Feedback web page](https://positivefb.com/gm-id-methodology/)
            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "novaad",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<4.0,>=3.11",
    "maintainer_email": null,
    "keywords": "analog, mixed-signal, ic, design, gm/id, eda-cad",
    "author": "dasdias",
    "author_email": "das.dias@campus.fct.unl.pt",
    "download_url": "https://files.pythonhosted.org/packages/b8/83/d989a13b0b464ea204dc234446f927fdfedb9e6e12fb45f58d4aa0776da4/novaad-0.1.6.tar.gz",
    "platform": null,
    "description": "# novaad\n### Gm/Id Analog/Mixed-Signal IC Design Tool\n\nThis tool is inspired in [Prof. B. Mumman's Gm/Id CAD tool/book](https://github.com/bmurmann/Book-on-gm-ID-design/tree/main/starter_kit), also providing support for interpolation upon look-up. This tool extends the former by being deployed as a Python library, providing an API as well as a CLI that can both be used to perform analog IC design.\n\n<div>\n<img align=center width=500 src=./docs/figs/eqs.png>\n</img>\n</div>\n\nThe tool can be used with the Gm/Id method in a forward modelling problem:\n  - Given: \n    - A DC operating point (e.g., vgs, vds, vsb, ids),\n    - A target drain current (ids) or transconductance (gm),\n    - A target Gm/Id ratio (encoding inversion region information), and a channel length (lch) (encoding intirnsic gain (Gm/Gds) and maximum operating frequency information (Gm/Cgg))\n  - Optain the device width (w) that satisfies the target Gm/Id ratio for the given DC-OP.\nIf Vgs is not provided, it will also be targetted as an output design parameter to achieve the target Gm/Id ratio.\n\nThe tool can also be used in a reverse modelling problem:\n  - Given:\n    - A DC operating point (vgs, vds, vsb, ids),\n    - A device width (w),\n    - A channel length (lch),\n  - Obtain the electrical characteristics of the device (e.g., gm, gds, cgg, cgs, cgd, etc.)\n\nNote that this tool doesn't take into account the effect of number of fingers right now. This is a feature that will be added in the future.\n\n## 1. Installation\n\nInstall as a normal Python package from PyPI:\n\n```bash\npip install novaad\n```\n\n## 2. Usage\n\nThere are a sequence of steps required to use the tool:\n1. Extract the Look-Up Table (LUT) for each NMOS and PMOS device in the technology of interest. \n   1. Example Cadence Ocean scripts are provided in my['cadence-scripts'](https://github.com/das-dias/cadence_workflow/tree/master/cadence-scripts/gmid) directory to extract the LUTs.\n\n2. Make sure the LUTs are provided in ```.csv``` format.\n   1. The LUTs should follow the same exact naming convention used in the Cadence Ocean scripts pointed above but without the device type extension (e.g., ```nmos: _n``` or ```pmos: _p```).\n   \n   2. For both NMOS and PMOS devices, Gate-Source Voltage (Vgs), Drain-Source Voltage (Vds), Source-Bulk (Vsb) and Drain-Source Current (Ids) should be provided in the LUTs with the naming: ```vgs, vds, vsb, ids```.\n\n### *2.1. API*\n\nThe CLI is supported by a flexible Python library that can be used from a Python script. The following example shows how to use the library to perform the Gm/Id design:\n\n```python\n# Create a Device instance object\ndevice = Device(\n        \"./test/data/test_nch_lut_renamed.csv\",\n        device_type=\"nch\",\n)\n\n# Perform a customized LUT lookup:\n\noutput_cols = [\"av\", \"jd\", \"ft\"]\ntarget = { # all lists must have the same length\n    \"vgs\": [device.lut[\"vgs\"].mean()],\n    \"vds\": [0.9],\n    \"vsb\": [0.0],\n    \"lch\": [device.lut[\"lch\"].min() * 1],\n    \"gmoverid\": [10.0],\n}\n\nkwargs = { # interp_method: \"pchip\" (default), see Pandas.DataFrame.interpolate for more options\n    \"interp_method\": \"nearest\",\n    \"interp_mode\": \"default\",\n}\nrow = device.look_up(output_cols,targetreturn_xy=True, **kwargs)\n\nprint(row)\n\"\"\" row ( as Pandas.DataFrame )\nOutput: \n\n            lch  gmoverid  vgs       jd  vsb            ft       av  vds\n1  1.800000e-07     8.909  0.7  35.1764  0.0  2.680000e+10  38.6127  0.9\n\"\"\"\n\n# Perform a Gm/Id sizing operation for a given device:\n\nsizing_spec = DeviceSizingSpecification(\n    vgs=0.5, vds=0.6, vsb=0.0, lch=device.lut[\"lch\"].min(), gmoverid=10.0, gm=1e-3\n)\nsizing = device.sizing(sizing_spec)\nprint(sizing.to_df())\n\"\"\" sizing ( as Pandas.DataFrame )\nOutput:\n            lch       wch\n0  1.800000e-07  0.000004\n\"\"\"\n```\n\nIt is important to note that during lookup, and contrary to ```gmoverid```, ```vgs``` is not prioritized as a target. Vgs should be chosen accordingly to the level of inversion we want for our device. As such, upon computing the closest rows and performing interpolation (the two main operations behind interpolating look up) might lead to a slightly different DC Operating Point in order to achieve the targetted Gm/Id spec along with the VDS, Lch and VSB simultaneously.\n\nThis API effectively enables the user to fit the tool into an optimization loop to perform automatic sizing of whole circuits like OTA's, filters, buffers, etc.\n\n### *2.2. CLI*\n\n\n\nAfter extracting the LUT's, create a configuration file using ```.yaml``` format with the following structure:\n  \n\n```yaml\n# example_config.yaml\n\nnch:\n  lut_path: path/to/nmos_lut.csv\n  ref_width: 10e-6 # Constant width used to extract the LUT\n\npch:\n  lut_path: path/to/pmos_lut.csv\n  ref_width: 10e-6 # Constant width used to extract the LUT\n\n```\n\nThis configuration file can be parsed to the CLI to under the ```--config``` flag. Alternatively, you can create a configuration file with the default name ```novaad.cfg.yml``` in the same directory as the CLI is being executed and the tool will automatically load it without the need to specify the ```--config``` flag.\n\nAs of ```v.0.1.2``` the tool supports ```.csv``` and ```.h5``` (HDF5 binary) file formats for a more efficient LUT memory storage and readout. The tool will automatically detect the file format and load the LUTs accordingly.\n\n\nAfter creating the configuration file and creating the LUTs, you are finally able to use the CLI to perform the Gm/Id design.\n\n* **Help**\n\n```bash\n# Input:\n$ novaad --help\n```\n\n```bash\n# Output:\nnovaad\n\nLUT-based Analog/Mixed-Signal IC Design Tool using Gm/Id Methodology.\n    \nUsage:\n  novaad (device | moscap | switch ) -i=INPUT_FILE [-o=OUTPUT_FILE] [--noise] [--gui] [--verbose] [--config=CONFIG_FILE]\n  novaad --gui --type=TYPE [--vds=VSB --vsb=VSB --lch-plot LCH_PLOT ...] [--config=CONFIG_FILE]\n  novaad (-h | --help)\n  novaad --version\n  novaad COMMAND_FILE\n\nOptions:\n  -h --help                   Show this screen.\n  --version                   Show version.\n  -i, --input=INPUT_FILE      Input file.\n  -o, --output=OUTPUT_FILE    Output file.\n  COMMAND_FILE                File with commands to run.\n  --gui                       Launch GUI.\n  --vds=VDS                   Drain-to-Source Voltage. Default value is LUT mean.\n  --vsb=VSB                   Bulk-to-Source Voltage. Default value is LUT minimum.\n  --type=TYPE                 Device Type [default: 'nch'].\n  --lch-plot                  Channel lengths to include in plot [default: 'all'].\n  --noise                     Include noise summary in the analysis.\n  --verbose                   Verbose Output.\n  --config=CONFIG_FILE        Configuration file [default: 'cfg.yml'].\n\n```\n\n* **Input file:**\n\n\nTo use ```novaad```'s design capabilities, you must specify your design targets in an input ```.toml``` file. An example of such file is shown below:\n\n```toml\n# example_input.toml\n[device]\nm0 = { type = \"nch\", vds = 0.5, vsb = 0.0, lch = 180e-9, gmid = 26, gm = 1e-3 }\nm1 = { type = \"pch\", vgs = 0.8, vds = 1.3, vsb = 0.0, lch = 180e-9, gmid = 23, gm = 1e-3 } # No output generated for this device; there is no LUT\nm2 = { type = \"nch\" , vgs = 0.8, vds = 0.5, vsb = 0.0, lch = 180e-9, gmid = 10, ids = 500e-6 }\nm3 = { type = \"nch\" , vgs = 0.8, vds = 0.5, vsb = 0.0, lch = 1e-6, wch = 12e-6, ids = 100e-6 }\n\n[noise]\nm0 = {t_celsius = 36, noise_fmax = 100e6, flicker_corner_freq=30e3}\n\n# the current test lut doesn't support vsb above 0.0\n[moscap]\nm4 = { type = \"nch\", vgs = 0.8, vds = 0.5, vsb = 0.0, lch = 180e-9, cgg = 1.2e-15 } # vds is ignored and set to minimum in LUT table\nm5 = { type = \"pch\", vgs = 0.8, vds = 1.3, vsb = 0.0, lch = 180e-9, cgg = 1.2e-15 } # No output due to no LUT!\nm6 = { type = \"nch\", vgs = 0.8, vsb = 0.0, lch = 180e-9, cgg = 1e-14 }\nm7 = { type = \"nch\", vgs = 0.8, vsb = 0.0, lch = 1e-6, cgg = 1e-14 }\nm8 = { type = \"nch\", vgs = 0.8, vsb = 0.0, lch = 1e-6, wch = 12e-6 } # if wch is parsed, cgg is ignored\n\n[switch]\nm9 = { type = \"nch\", vgs = 1.8, vds = 0.5, vsb = 0.0, lch = 180e-9, ron = 10 } # vds is ignored and set to minimum in LUT table\nm10 = { type = \"pch\", vgs = 0.8, vds = 1.3, vsb = 0.0, lch = 180e-9, ron = 10 } # No output due to no LUT!\nm11 = { type = \"nch\", vgs = 0.8, vsb = 0.0, lch = 180e-9, ron = 10 }\nm12 = { type = \"nch\", vgs = 0.8, vsb = 0.0, lch = 180e-9, ron = 10 }\nm13 = { type = \"nch\", vgs = 0.8, vsb = 0.0, lch = 1e-6, ron = 10 }\nm14 = { type = \"nch\", vgs = 0.8, vsb = 0.0, lch = 1e-6, wch = 12e-6 } # if wch is parsed, ron is ignored\n```\n\nThe input file is separated in four sections:\n1. **Device:** This section is used to specify the design targets for the Gm/Id design of transconductor devices. The following parameters are required:\n   - ```type```: Device type (```nch``` or ```pch```).\n   - ```vgs```: Gate-to-Source Voltage.\n   - ```vds```: Drain-to-Source Voltage.\n   - ```vsb```: Bulk-to-Source Voltage.\n   - ```lch```: Channel Length.\n   - ```gmid```: Target Gm/Id ratio.\n   - ```gm```: Target transconductance.\n   - ```ids```: Target drain current.\n   - ```wch```: Channel Width (optional).\n\n2. **Noise:** This section is used to specify the parameters to perform a simple model-based computation of the steady-state thermal and flicker noise for ```device``` instances (**ONLY DEVICE**). The following parameters are required:\n   - ```t_celsius```: Temperature in Celsius.\n   - ```noise_fmax```: Maximum frequency for noise analysis.\n   - ```flicker_corner_freq```: Flicker noise corner frequency.\n\nNOTE: To ignore flicker just set ```flicker_corner_freq = 0.0```.\n\n3. **Moscap:** This section is used to specify the design targets for the Gm/Id design of MOSCAP devices. The following parameters are required:\n   - ```type```: Device type (```nch``` or ```pch```).\n   - ```vgs```: Gate-to-Source Voltage.\n   - ```vds```: Drain-to-Source Voltage.\n   - ```vsb```: Source-to-Bulk Voltage.\n   - ```lch```: Channel Length.\n   - ```cgg```: Target total-gate capacitance.\n\n4. **Switch:** This section is used to specify the design targets for the Gm/Id design of Switch devices. The following parameters are required:\n    - ```type```: Device type (```nch``` or ```pch```).\n    - ```vgs```: Gate-to-Source Voltage.\n    - ```vds```: Drain-to-Source Voltage.\n    - ```vsb```: Source-to-Bulk Voltage.\n    - ```lch```: Channel Length.\n    - ```ron```: Target on-resistance.\n\nNOTE 2: The ```vds``` parameter is ignored for MOSCAP and SWITCH devices and set to the minimum value in the LUT table (ideally, will be set to ```0.0 V``` if such simulation space is included in the LUTs).\n\nBy specifing ```device```, ```moscap``` or ```switch``` in the CLI, the tool will perform the Gm/Id design for the corresponding instances in each section of the input file. \n\nAn example:\n\n```bash\n# Input:\n$ novaad device -i=path/to/example_input.toml --config=path/to/example_config.yaml\n```\n\n```bash\n# Output:\n(novaad-py3.11) \u279c  novaad git:(master) \u2717 novaad device --gui -i/Users/dasdias/Documents/ICDesign/cadence_workflow/test/test_input.toml\n.../novaad/novaad/__main__.py:166: UserWarning: No configuration found for pch.\n  warn(f'No configuration found for {spec.device_type.value}.')\n\nDevice Sizing Results:\n  Type  ID Vgs [V] Vds [V] Vsb [V] Wch [um] Lch [um]  Cgg [fF]  ...    Gm/Id    Gm [uS] Gds [uS]  Av [V/V]  Av [dB] Ft [GHz] FOM Av*Ft [GHz] FOM NBW [GHz/V]\n0  nch  m0    0.80    0.50    0.00  33.8682   0.1800  109.9022  ...  23.6611   411.4982   6.0861  143.0626  43.1105   0.9885        141.4173         23.3890\n0  nch  m2    0.80    0.50    0.00  65.8263   0.1800  314.6496  ...   9.9727  4986.3410  50.6533  107.3693  40.6176   2.5250        271.1076         25.1810\n0  nch  m3    0.80    0.50    0.00  12.0000   1.0000   68.4000  ...   8.9520   895.2000   7.6440  126.4365  42.0374   2.2800        288.2752         20.4106\n\n[3 rows x 22 columns]\n```\n\n\n* **GUI**\n  \nThe GUI can be launched in two modes of operation:\n\n1. Giving the ```--gui``` flag and specifying the type of device (```nch``` or ```pch```) to the graphs required to perform the Gm/Id design.\n   1. The channel lengths to include in the plot can also be specified using the ```--lch-plot``` flag.\n\nExample:\n\n```bash\n# Input:\n$ novaad --gui --type=nch --config=path/to/example_config.yaml\n```\n<div>\n<img align=center width=700 src=./docs/figs/gui_mode1.png>\n</img>\n</div>\n\n\n\n2. Giving the ```--gui``` flag and specifying the input file with the design targets. This will open a GUI page containing the result tables for the design targets specified in the input file.\n\nExample:\n\n```bash\n# Input:\n$ novaad device --gui -i=path/to/example_input.toml --config=path/to/example_config.yaml\n```\n\n<div>\n<img align=center width=700 src=./docs/figs/device.png>\n</img>\n</div>\n\n## 3. Dependencies\n\nThis project was developed using a Python 3.11 virtual environment. The following dependencies are required:\n\n```bash\n# requirements.txt\nnumpy:    pip install numpy\npandas:   pip install pandas\npyyaml:   pip install pyyaml\nplotly:   pip install plotly\ndocopt:   pip install docopt\nscipy:    pip install scipy\npydantic: pip install pydantic\nconfz:    pip install confz\ntoml:     pip install toml\n```\n\nI recommend the creation of a [Python virtual environment](https://docs.python.org/3/library/venv.html) in the folder in which you want to [setup](https://python.land/virtual-environments/virtualenv) this tool.\n\n```bash\n# Create a virtual environment on the current directory \n# inside a folder named 'venv'\n\n$ python -m venv venv\n\n# Activate the virtual environment\n$ source ./venv/bin/activate\n\n# Install tool\n$ pip install novaad\n```\n\nIf you are using Windows 10 or above, consider using the [Windows Subsystem for Linux (WSL)](https://docs.microsoft.com/en-us/windows/wsl/install) to run the tool. It will make your life easier as no dedicated Windows support is provided for now.\n\n## 4. License\n\nThis project is licensed under the [BSD 2-Clause License](https://opensource.org/license/bsd-2-clause) - see the [LICENSE](./LICENSE) file for details.\n\n## 5. Contributing\n\nFor now, the only maintainer of this project is the author (me). If you want to contribute, please contact me at ```das.dias@campus.fct.unl.pt``` or ```ddias@tudelft.nl```.\n\n## 6. Acknowledgements\n\n* Prof. Jo\u00e3o Goes - Reverse usage mode of the Gm/Id method for getting the electrical characteristics of the device from sizing and DC-OP information.\n\n* [Positive Feedback web page](https://positivefb.com/gm-id-methodology/)",
    "bugtrack_url": null,
    "license": "BSD-2",
    "summary": "An Analog/Mixed-Signal IC design tool based on the Gm/Id method.",
    "version": "0.1.6",
    "project_urls": null,
    "split_keywords": [
        "analog",
        " mixed-signal",
        " ic",
        " design",
        " gm/id",
        " eda-cad"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "66d4754b73eac7557496758816863a10749c5231a8496d227a8fa52aaa89e892",
                "md5": "5404d1bcb5727484cb57d32a34d3460e",
                "sha256": "b865653a5832927a4fc01cc1de2134e59449733ee581e127f569ecd7cb2ecd0f"
            },
            "downloads": -1,
            "filename": "novaad-0.1.6-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "5404d1bcb5727484cb57d32a34d3460e",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<4.0,>=3.11",
            "size": 28372,
            "upload_time": "2024-09-13T08:15:22",
            "upload_time_iso_8601": "2024-09-13T08:15:22.575981Z",
            "url": "https://files.pythonhosted.org/packages/66/d4/754b73eac7557496758816863a10749c5231a8496d227a8fa52aaa89e892/novaad-0.1.6-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b883d989a13b0b464ea204dc234446f927fdfedb9e6e12fb45f58d4aa0776da4",
                "md5": "794aaa636bb15c1505fb4274bc1546f3",
                "sha256": "24f53d4259e2b0fba5b1d2113353a3836fc6c3020185b2d016e9131375862984"
            },
            "downloads": -1,
            "filename": "novaad-0.1.6.tar.gz",
            "has_sig": false,
            "md5_digest": "794aaa636bb15c1505fb4274bc1546f3",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<4.0,>=3.11",
            "size": 1286619,
            "upload_time": "2024-09-13T08:15:24",
            "upload_time_iso_8601": "2024-09-13T08:15:24.796062Z",
            "url": "https://files.pythonhosted.org/packages/b8/83/d989a13b0b464ea204dc234446f927fdfedb9e6e12fb45f58d4aa0776da4/novaad-0.1.6.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-09-13 08:15:24",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "novaad"
}
        
Elapsed time: 0.38550s