Skip to main content

NEURON Modeling Language Source-to-Source Compiler Framework

Project description

github workflow Build Status codecov CII Best Practices

The NMODL Framework is a code generation engine for NEURON MODeling Language (NMODL). It is designed with modern compiler and code generation techniques to:

  • Provide modular tools for parsing, analysing and transforming NMODL

  • Provide easy to use, high level Python API

  • Generate optimised code for modern compute architectures including CPUs, GPUs

  • Flexibility to implement new simulator backends

  • Support for full NMODL specification

About NMODL

Simulators like NEURON use NMODL as a domain specific language (DSL) to describe a wide range of membrane and intracellular submodels. Here is an example of exponential synapse specified in NMODL:

NEURON {
    POINT_PROCESS ExpSyn
    RANGE tau, e, i
    NONSPECIFIC_CURRENT i
}
UNITS {
    (nA) = (nanoamp)
    (mV) = (millivolt)
    (uS) = (microsiemens)
}
PARAMETER {
    tau = 0.1 (ms) <1e-9,1e9>
    e = 0 (mV)
}
ASSIGNED {
    v (mV)
    i (nA)
}
STATE {
    g (uS)
}
INITIAL {
    g = 0
}
BREAKPOINT {
    SOLVE state METHOD cnexp
    i = g*(v - e)
}
DERIVATIVE state {
    g' = -g/tau
}
NET_RECEIVE(weight (uS)) {
    g = g + weight
}

Installation

See INSTALL.rst for detailed instructions to build the NMODL from source.

Try NMODL with Docker

To quickly test the NMODL Framework’s analysis capabilities we provide a docker image, which includes the NMODL Framework python library and a fully functional Jupyter notebook environment. After installing docker and docker-compose you can pull and run the NMODL image from your terminal.

To try Python interface directly from CLI, you can run docker image as:

docker run -it --entrypoint=/bin/sh bluebrain/nmodl

And try NMODL Python API discussed later in this README as:

$ python3
Python 3.6.8 (default, Apr  8 2019, 18:17:52)
>>> from nmodl import dsl
>>> import os
>>> examples = dsl.list_examples()
>>> nmodl_string = dsl.load_example(examples[-1])
...

To try Jupyter notebooks you can download docker compose file and run it as:

wget "https://raw.githubusercontent.com/BlueBrain/nmodl/master/docker/docker-compose.yml"
DUID=$(id -u) DGID=$(id -g) HOSTNAME=$(hostname) docker-compose up

If all goes well you should see at the end status messages similar to these:

[I 09:49:53.923 NotebookApp] The Jupyter Notebook is running at:
[I 09:49:53.923 NotebookApp] http://(4c8edabe52e1 or 127.0.0.1):8888/?token=a7902983bad430a11935
[I 09:49:53.923 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
    To access the notebook, open this file in a browser:
        file:///root/.local/share/jupyter/runtime/nbserver-1-open.html
    Or copy and paste one of these URLs:
        http://(4c8edabe52e1 or 127.0.0.1):8888/?token=a7902983bad430a11935

Based on the example above you should then open your browser and navigate to the URL http://127.0.0.1:8888/?token=a7902983bad430a11935.

You can open and run all example notebooks provided in the examples folder. You can also create new notebooks in my_notebooks, which will be stored in a subfolder notebooks at your current working directory.

Using the Python API

Once the NMODL Framework is installed, you can use the Python parsing API to load NMOD file as:

from nmodl import dsl

examples = dsl.list_examples()
nmodl_string = dsl.load_example(examples[-1])
driver = dsl.NmodlDriver()
modast = driver.parse_string(nmodl_string)

The parse_file API returns Abstract Syntax Tree (AST) representation of input NMODL file. One can look at the AST by converting to JSON form as:

>>> print (dsl.to_json(modast))
{
  "Program": [
    {
      "NeuronBlock": [
        {
          "StatementBlock": [
            {
              "Suffix": [
                {
                  "Name": [
                    {
                      "String": [
                        {
                          "name": "POINT_PROCESS"
                        }
                    ...

Every key in the JSON form represent a node in the AST. You can also use visualization API to look at the details of AST as:

from nmodl import ast
ast.view(modast)

which will open AST view in web browser:

ast_viz

Vizualisation of the AST in the NMODL Framework

The central Program node represents the whole MOD file and each of it’s children represent the block in the input NMODL file. Note that this requires X-forwarding if you are using the Docker image.

Once the AST is created, one can use exisiting visitors to perform various analysis/optimisations. One can also easily write his own custom visitor using Python Visitor API. See Python API tutorial for details.

The NMODL Framework also allows us to transform the AST representation back to NMODL form as:

>>> print (dsl.to_nmodl(modast))
NEURON {
    POINT_PROCESS ExpSyn
    RANGE tau, e, i
    NONSPECIFIC_CURRENT i
}

UNITS {
    (nA) = (nanoamp)
    (mV) = (millivolt)
    (uS) = (microsiemens)
}

PARAMETER {
    tau = 0.1 (ms) <1e-09,1000000000>
    e = 0 (mV)
}
...

High Level Analysis and Code Generation

The NMODL Framework provides rich model introspection and analysis capabilities using various visitors. Here is an example of theoretical performance characterisation of channels and synapses from rat neocortical column microcircuit published in 2015:

nmodl-perf-stats

Performance results of the NMODL Framework

To understand how you can write your own introspection and analysis tool, see this tutorial.

Once analysis and optimization passes are performed, the NMODL Framework can generate optimised code for modern compute architectures including CPUs (Intel, AMD, ARM) and GPUs (NVIDIA, AMD) platforms. For example, C++, OpenACC and OpenMP backends are implemented and one can choose these backends on command line as:

$ nmodl expsyn.mod sympy --analytic

To know more about code generation backends, see here. NMODL Framework provides number of options (for code generation, optimization passes and ODE solver) which can be listed as:

$ nmodl -H
NMODL : Source-to-Source Code Generation Framework [version]
Usage: /path/<>/nmodl [OPTIONS] file... [SUBCOMMAND]

Positionals:
  file TEXT:FILE ... REQUIRED           One or more MOD files to process

Options:
  -h,--help                             Print this help message and exit
  -H,--help-all                         Print this help message including all sub-commands
  --verbose=info                        Verbose logger output (trace, debug, info, warning, error, critical, off)
  -o,--output TEXT=.                    Directory for backend code output
  --scratch TEXT=tmp                    Directory for intermediate code output
  --units TEXT=/path/<>/nrnunits.lib
                                        Directory of units lib file

Subcommands:
host
  HOST/CPU code backends
  Options:
    --c                                   C/C++ backend (true)

acc
  Accelerator code backends
  Options:
    --oacc                                C/C++ backend with OpenACC (false)

sympy
  SymPy based analysis and optimizations
  Options:
    --analytic                            Solve ODEs using SymPy analytic integration (false)
    --pade                                Pade approximation in SymPy analytic integration (false)
    --cse                                 CSE (Common Subexpression Elimination) in SymPy analytic integration (false)
    --conductance                         Add CONDUCTANCE keyword in BREAKPOINT (false)

passes
  Analyse/Optimization passes
  Options:
    --inline                              Perform inlining at NMODL level (false)
    --unroll                              Perform loop unroll at NMODL level (false)
    --const-folding                       Perform constant folding at NMODL level (false)
    --localize                            Convert RANGE variables to LOCAL (false)
    --global-to-range                     Convert GLOBAL variables to RANGE (false)
    --localize-verbatim                   Convert RANGE variables to LOCAL even if verbatim block exist (false)
    --local-rename                        Rename LOCAL variable if variable of same name exist in global scope (false)
    --verbatim-inline                     Inline even if verbatim block exist (false)
    --verbatim-rename                     Rename variables in verbatim block (true)
    --json-ast                            Write AST to JSON file (false)
    --nmodl-ast                           Write AST to NMODL file (false)
    --json-perf                           Write performance statistics to JSON file (false)
    --show-symtab                         Write symbol table to stdout (false)

codegen
  Code generation options
  Options:
    --layout TEXT:{aos,soa}=soa           Memory layout for code generation
    --datatype TEXT:{float,double}=soa    Data type for floating point variables
    --force                               Force code generation even if there is any incompatibility
    --only-check-compatibility            Check compatibility and return without generating code
    --opt-ionvar-copy                     Optimize copies of ion variables (false)

Documentation

We are working on user documentation, you can find current drafts of :

Citation

If you would like to know more about the the NMODL Framework, see following paper:

  • Pramod Kumbhar, Omar Awile, Liam Keegan, Jorge Alonso, James King, Michael Hines and Felix Schürmann. 2019. An optimizing multi-platform source-to-source compiler framework for the NEURON MODeling Language. In Eprint : arXiv:1905.02241

Support / Contribuition

If you see any issue, feel free to raise a ticket. If you would like to improve this framework, see open issues and contribution guidelines.

Examples / Benchmarks

The benchmarks used to test the performance and parsing capabilities of NMODL Framework are currently being migrated to GitHub. These benchmarks will be published soon in following repositories:

Funding & Acknowledgment

The development of this software was supported by funding to the Blue Brain Project, a research center of the École polytechnique fédérale de Lausanne (EPFL), from the Swiss government’s ETH Board of the Swiss Federal Institutes of Technology. In addition, the development was supported by funding from the National Institutes of Health (NIH) under the Grant Number R01NS11613 (Yale University) and the European Union’s Horizon 2020 Framework Programme for Research and Innovation under the Specific Grant Agreement No. 785907 (Human Brain Project SGA2).

Copyright © 2017-2023 Blue Brain Project, EPFL

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

nmodl_nightly-0.6.213-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.8 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

nmodl_nightly-0.6.213-cp312-cp312-macosx_10_15_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.12 macOS 10.15+ x86-64

nmodl_nightly-0.6.213-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.8 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

nmodl_nightly-0.6.213-cp311-cp311-macosx_10_15_x86_64.whl (2.8 MB view details)

Uploaded CPython 3.11 macOS 10.15+ x86-64

nmodl_nightly-0.6.213-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.8 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

nmodl_nightly-0.6.213-cp310-cp310-macosx_10_15_x86_64.whl (2.8 MB view details)

Uploaded CPython 3.10 macOS 10.15+ x86-64

nmodl_nightly-0.6.213-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.8 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

nmodl_nightly-0.6.213-cp39-cp39-macosx_10_15_x86_64.whl (2.8 MB view details)

Uploaded CPython 3.9 macOS 10.15+ x86-64

nmodl_nightly-0.6.213-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.8 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

nmodl_nightly-0.6.213-cp38-cp38-macosx_10_15_x86_64.whl (2.8 MB view details)

Uploaded CPython 3.8 macOS 10.15+ x86-64

File details

Details for the file nmodl_nightly-0.6.213-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for nmodl_nightly-0.6.213-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f47b700da45c39a49a97eb5e20ce5f4fb2fc460e18a2e56d0a1fcf002065d371
MD5 cf6294059f54d44ad7411efb84fca21f
BLAKE2b-256 18575a882f80979f9aaf3d7628b375e12b45b9713645fb7827a957849b8ea6c8

See more details on using hashes here.

Provenance

File details

Details for the file nmodl_nightly-0.6.213-cp312-cp312-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for nmodl_nightly-0.6.213-cp312-cp312-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 619643017782ed2ee34f8d9889225616ae6474b5d0739edca4649db4ccefe330
MD5 ca2892b4fda982259437795dd905d4c0
BLAKE2b-256 47fb25268cf68d04bfcce8ab16f1804ebd3b5c21c0c423219d39d8bdead7f6ae

See more details on using hashes here.

Provenance

File details

Details for the file nmodl_nightly-0.6.213-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for nmodl_nightly-0.6.213-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d954e7207e6fc513194f11d03e08cf97c7b83402e2c64720d8955ff16aee7e22
MD5 d1b9ca7520dedba76473e031790a1ca6
BLAKE2b-256 686138ac9c8ebd6c914869df295a407863636d6a78446c4678466d887273a108

See more details on using hashes here.

Provenance

File details

Details for the file nmodl_nightly-0.6.213-cp311-cp311-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for nmodl_nightly-0.6.213-cp311-cp311-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 289950b7ce569ca72c3f0372ebd3836fbb583db3f2382b9732a7732fd579b419
MD5 c5fc4262553afa35ecc1e0d7305a8c8d
BLAKE2b-256 68253de77c0b964b4c1e76bf0af4556f11d4f5b8523ce64eb872a7ee81a415e5

See more details on using hashes here.

Provenance

File details

Details for the file nmodl_nightly-0.6.213-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for nmodl_nightly-0.6.213-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 18e6f1151b2290d998db0c129615b446e8714ef2eb3d9d77137d52a1668666c4
MD5 57bd9c8083d5a8bec3a77713ed65af2f
BLAKE2b-256 e749cc1824a9e8c02d75bc43923ff09e1693d4dcca2787d59027bc5be870bef9

See more details on using hashes here.

Provenance

File details

Details for the file nmodl_nightly-0.6.213-cp310-cp310-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for nmodl_nightly-0.6.213-cp310-cp310-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 02360f43f99c2276e5914f3c3a577192bc961b80c03db91921b29c1c75436ce6
MD5 13a5600d5b77f2a4504e42b4b1e3d3cc
BLAKE2b-256 92973d3bdf3d7833a2456d11fa00dbf0c8edc9f55f7070d39646489331f87752

See more details on using hashes here.

Provenance

File details

Details for the file nmodl_nightly-0.6.213-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for nmodl_nightly-0.6.213-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fb2b628880108868f826472e36a2e0eedfd16cacf5676cd20fb7ba9ffdc85ab4
MD5 f7dc8d96ad4df1aa5150f04200911d55
BLAKE2b-256 b8b2e374cacfca0a707be8d185c3f1f0dba1bbdb745a7d67c268681268947c82

See more details on using hashes here.

Provenance

File details

Details for the file nmodl_nightly-0.6.213-cp39-cp39-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for nmodl_nightly-0.6.213-cp39-cp39-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 1e687727b86b1cc39dcf17f95e39e6668e6504ec8ffe2734e0e668c807e5043b
MD5 5910efa6196c60212bc11eadd48fc505
BLAKE2b-256 5818b1c9b1b19542c845c0e72a4caf205dd82e43816f0c5047c676231ea0b413

See more details on using hashes here.

Provenance

File details

Details for the file nmodl_nightly-0.6.213-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for nmodl_nightly-0.6.213-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 16b054109c70373aa77e44ad84d696fca299e6cee03efdd90635ec1d258d0203
MD5 774f462106ff717448b3a87a5ac1d6ce
BLAKE2b-256 1c930f66b1a71142eb94db324102ce1ff39df86c61be65b842dd4828563ad0db

See more details on using hashes here.

Provenance

File details

Details for the file nmodl_nightly-0.6.213-cp38-cp38-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for nmodl_nightly-0.6.213-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 a7adba1142e2902aedd843f98dec7151ab6fe1759f3ef6ef76868164dc88b861
MD5 8e007931b52b26c0d3de9ab72d4c030e
BLAKE2b-256 28f4bcb3a8e6bcfb82c2a254f02fb9c6ba77d534dd99b6151aece2efa9ec12b0

See more details on using hashes here.

Provenance

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page