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.229-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.229-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.229-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.229-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.229-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.229-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.229-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.229-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.229-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.229-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.229-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for nmodl_nightly-0.6.229-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 65d72e6991cb4b479a4995daccd7d2339340421d522cdc74b9d28c40bf54d949
MD5 1f72771192d2ec91019e6e53930d6121
BLAKE2b-256 7316802599f5ea9da6b3c34f66fd0be5877754f99b2c655e6d0854fe5a28f1ab

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for nmodl_nightly-0.6.229-cp312-cp312-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 da85aa88b51dc5684218bc5fe68a2c22d2884f2dbf6ac69e8f553157a315b9f4
MD5 8c2508587628d9393f8fe4f1b938498b
BLAKE2b-256 7d56d5a976021b21d2e75b390bfc437756d6ff8e896ff4ba8b03f3224027281c

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for nmodl_nightly-0.6.229-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 36294575024bcb9be5abbc20866249f10e74a59106c279a9c5c9ab3dfc5c1d6b
MD5 9c7e2b3bca0d6d2ca94b436550eaab7e
BLAKE2b-256 2ef645bc21f8840639c0a58b28c70a46df3b0110d64db6a7de482c5d73b4a03c

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for nmodl_nightly-0.6.229-cp311-cp311-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 7795cc5288e74fcab40db6822989e05a46466a51fbf859e4e5bd48da6b2ece1a
MD5 70aab286b1c54df3fd66553095ae0fd4
BLAKE2b-256 14b2fa27106a2fbe78cd408b2f96bba4341e80567f82377b6c0c5a175f662539

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for nmodl_nightly-0.6.229-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 22d55709e60470a1ce158bed881cd674637dcd2724eb40fb3552c2a37168f000
MD5 af50282d5e8c70a1029eff8375ddda3f
BLAKE2b-256 02d909e308801c4d4a025cac0b8d252cfbfa2819e2ea65df609c67315a837aff

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for nmodl_nightly-0.6.229-cp310-cp310-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 24245ee1892da5de2023396d96c9929f864406d22463804c507b9bd1b54cf4d1
MD5 643d117e18d5c3601acd3f20f8f96c80
BLAKE2b-256 f1a0c534568558462297332c1ff103232b397d741380052524a619919564bd6e

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for nmodl_nightly-0.6.229-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2b9556db39b49f6912cd4b198de4e7249951600e3e6c1e70d57168989dc73b84
MD5 cd4be3d668f3323d7639d4cef23371a6
BLAKE2b-256 0b69be379f8c2258dfcf95af96aa95a5179274c0a031f6f045aa57a4f55353ac

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for nmodl_nightly-0.6.229-cp39-cp39-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 408e10d8eeaf73bc82f645ee360c3cec37a0498c1e79270ddf42df42bc1ab826
MD5 207bf6bfd905dab6180b52967cc2039b
BLAKE2b-256 b9f38c617f4e869a136ec8bcd0ef28c93132dbf9bdc40da2a08855c8c16b8707

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for nmodl_nightly-0.6.229-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 770e13a0b76838a8b60e76fbdd0743811a812b969ab44b1ac58e26b00140e4ff
MD5 9d3120407eb7e42e7585176939d5c358
BLAKE2b-256 87a7f2d1cb1589fd316f7642d8214fac1e983c4fa5569407cca2f3b7c378b371

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for nmodl_nightly-0.6.229-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 ca4867b6650ac4def86b407b4448e44202f14f60cf4e447b9c862e675dbb071d
MD5 a7c11cfe0dc0f1e1150eae6b4fcc33bc
BLAKE2b-256 c8b4622b1ef8f6c1d5079deccd1feff00068e85e5537aed5dae638f1dd3166d5

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