Changeset 13004 in project


Ignore:
Timestamp:
01/13/09 05:35:55 (11 years ago)
Author:
Ivan Raikov
Message:

Many bug fixes in nmodl backend; factored out ion definitions into a separate module.

Location:
release/3/nemo/trunk
Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • release/3/nemo/trunk/examples/AKP06/Makefile

    r12375 r13004  
    11
    22
    3 all: PotIhCa.mod Narsg.mod Na.mod
     3all: AKP06.mod PotIhCa.mod Narsg.mod Na.mod
     4
     5AKP06.mod: AKP06.nemo
     6        nemo -t --nmodl --nmodl-method=adeuler $<
    47
    58PotIhCa.mod: PotIhCa.nemo
  • release/3/nemo/trunk/nemo-nmodl.scm

    r12960 r13004  
    3232(require-extension nemo-core)
    3333(require-extension nemo-utils)
     34(require-extension nemo-ionch)
    3435
    3536(define-extension nemo-nmodl)
     
    332333        (pp indent "}"))) 
    333334    ))
    334 
    335 (define (define-state indent n)
    336   (pp indent (,(nmodl-name n))))
    337335
    338336(define (expeuler dt name rhs)
     
    609607
    610608
    611 (define (collect-epools sys)
    612   (define (iscomp? x)
    613     (match x (('decaying-pool name id) id) (('decaying 'pool name id) id)
    614            (else #f)))
    615    (match-let ((($ nemo:quantity 'DISPATCH  dis) (environment-ref sys (nemo-intern 'dispatch))))
    616      (let recur ((comp-name (nemo-intern 'toplevel)) (ax (list)))
    617        (let ((subcomps  ((dis 'component-subcomps)  sys comp-name)))
    618          (let-values (((epool-comps other-comps)  (partition iscomp? subcomps)))
    619                      (let ((epools (map (lambda (x)
    620                                           (let ((exports ((dis 'component-exports) sys (third x))))
    621                                             (if (null? exports)
    622                                                 (nemo:error 'nemo:nmodl-translator
    623                                                             ": ion pool component " (third x)
    624                                                             " must export a state"))
    625                                             `(,@(cdr x) ,(car exports))))
    626                                            epool-comps)))
    627                        (fold recur (append epools ax) (map third other-comps))))))))
    628 
    629609
    630610(define (nemo:nmodl-translator sys . rest)
     
    636616    (let ((imports  ((dis 'imports)  sys))
    637617          (exports  ((dis 'exports)  sys)))
    638       (let* ((indent      0)
    639              (indent+     (+ 2 indent ))
    640              (table-with  (and table? (inexact->exact (round (/ (abs (- max-v min-v)) step)))))
    641              (eval-const  (dis 'eval-const))
    642              (sysname     (nmodl-name ((dis 'sysname) sys)))
    643              (deps*       ((dis 'depgraph*) sys))
    644              (consts      ((dis 'consts)  sys))
    645              (asgns       ((dis 'asgns)   sys))
    646              (states      ((dis 'states)  sys))
    647              (kinetic     (if (eq? kinetic 'all) (delete-duplicates (map first states)) kinetic))
    648              (reactions   ((dis 'reactions) sys))
    649              (rates       ((dis 'rates) sys))
    650              (defuns      ((dis 'defuns)  sys))
    651              (components  ((dis 'components) sys))
    652              (ionchs      (filter-map (match-lambda ((name 'ion-channel id) (list name id)) (else #f)) components))
    653              (epools      (collect-epools sys)))
    654 
    655         (match-let (((state-list asgn-list g) deps*))
    656          (let* ((poset             (vector->list ((dis 'depgraph->bfs-dist-poset) g)))
    657                 (asgn-eq-defs      (poset->asgn-eq-defs poset sys))
    658                 (perm-ions         (fold (lambda (ionch ax)
    659                                            (let* ((subcomps ((dis 'component-subcomps) sys (cid ionch)))
    660                                                   (perm      (lookup-def 'permeating-substance subcomps)))
    661                                              (if perm
    662                                                  (case (cn perm)
    663                                                    ((non-specific)   
    664                                                     (let* ((erev (car ((dis 'component-exports) sys (cid perm))))
    665                                                            (i    (nmodl-name 'i))
    666                                                            (e    (nmodl-name 'e)))
    667                                                       (cons `(,(cn perm) ,i ,e ,erev) ax)))
    668                                                    (else (let* ((erev (car ((dis 'component-exports) sys (cid perm))))
    669                                                                 (i    (nmodl-name (s+ 'i (cn perm))))
    670                                                                 (e    (nmodl-name (s+ 'e (cn perm)))))
    671                                                            (cons `(,(cn perm) ,i ,e ,erev) ax))))
    672                                                  ax)))
    673                                          (list) ionchs))
    674                (acc-ions           (fold (lambda (ionch ax)
    675                                            (let* ((subcomps ((dis 'component-subcomps) sys (cid ionch)))
    676                                                   (acc   (lookup-def 'accumulating-substance subcomps))
    677                                                   (i     (and acc (nmodl-name (s+ 'i (cn acc)))))
    678                                                   (in    (and acc (nmodl-name (s+ (cn acc) 'i))))
    679                                                   (out   (and acc (nmodl-name (s+ (cn acc) 'o)))))
    680                                              (if acc  (cons `(,(cn acc) ,i ,in ,out) ax) ax)))
    681                                          (list) ionchs))
    682                (pool-ions          (map (lambda (ep)
    683                                           (let ((ion (first ep))
    684                                                 (state (third ep)))
    685                                                 `(,(nmodl-name state) ,(nmodl-name (s+ 'i ion))
    686                                                   ,(nmodl-name (s+ ion 'i)))))
    687                                         epools))
    688                (i-gates           (fold (lambda (ionch ax)
    689                                            (let* ((subcomps     ((dis 'component-subcomps) sys (cid ionch)))
    690                                                   (i-gate-comp  (lookup-def 'binary-gate subcomps)))
    691                                              (if i-gate-comp
    692                                                  (let* ((i-gate-exps  ((dis 'component-exports) sys (cid i-gate-comp)))
    693                                                         (asgn-names   asgns)
    694                                                         (i-gate-var   (find (lambda (x) (member x asgn-names))
    695                                                                             i-gate-exps)))
    696                                                    (if (not i-gate-var)
    697                                                        (nemo:error 'nemo:nmodl-translator
    698                                                                    ": binary gate in channel " (cn ionch)
    699                                                                    " must export an assignment"))
    700                                                    (cons (list i-gate-var ) ax))
    701                                                  ax)))
    702                                          (list) ionchs))
    703                (has-kinetic?       (or (not (null? (filter (lambda (x) (member (car x) kinetic)) states)))))
    704                (has-ode?           (or (not (null? (filter (lambda (x) (not (member (car x) kinetic))) states)))
    705                                        (not (null? pool-ions)))))
    706 
    707 
    708            (for-each
    709             (lambda (a)
    710               (let ((acc-ion   (car a)))
    711                 (if (assoc acc-ion perm-ions)
    712                     (nemo:error 'nemo:nmodl-translator
    713                                 ": ion species " acc-ion " cannot be declared as both accumulating and permeating"))))
    714             acc-ions)
    715 
    716            (for-each
    717             (lambda (p)
    718               (let ((pool-ion  (car p)))
    719                 (if (assoc pool-ion perm-ions)
    720                     (nemo:error 'nemo:nmodl-translator
    721                                 ": ion species " pool-ion " cannot be declared as both pool and permeating"))))
    722             pool-ions)
     618      (let* ((indent        0)
     619             (indent+       (+ 2 indent ))
     620             (table-with    (and table? (inexact->exact (round (/ (abs (- max-v min-v)) step)))))
     621             (eval-const    (dis 'eval-const))
     622             (sysname       (nmodl-name ((dis 'sysname) sys)))
     623             (consts        ((dis 'consts)  sys))
     624             (asgns         ((dis 'asgns)   sys))
     625             (states        ((dis 'states)  sys))
     626             (kinetic       (if (eq? kinetic 'all) (delete-duplicates (map first states)) kinetic))
     627             (reactions     ((dis 'reactions) sys))
     628             (rates         ((dis 'rates) sys))
     629             (defuns        ((dis 'defuns)  sys))
     630             (components    ((dis 'components) sys))
     631             (g             (match-let (((state-list asgn-list g) ((dis 'depgraph*) sys))) g))
     632             (poset         (vector->list ((dis 'depgraph->bfs-dist-poset) g)))
     633             (asgn-eq-defs  (poset->asgn-eq-defs poset sys))
     634             (ionch-info    (nemo:ionch-query sys))
     635             (ionchs        (lookup-def 'ion-channels ionch-info))
     636             (perm-ions     (map (match-lambda ((comp i e erev) `(,comp ,(nmodl-name i) ,(nmodl-name e) ,erev)))
     637                                 (lookup-def 'perm-ions ionch-info)))
     638             (acc-ions      (map (match-lambda ((comp i in out) `(,comp ,@(map nmodl-name (list i in out)))))
     639                                 (lookup-def 'acc-ions ionch-info)))
     640             (epools        (lookup-def 'pool-ions ionch-info))
     641             (pool-ions     (map (lambda (lst) (map nmodl-name lst)) epools))
     642
     643             (i-gates       (lookup-def 'i-gates ionch-info))
     644
     645             (has-kinetic?  (or (not (null? (filter (lambda (x) (member (car x) kinetic)) states)))))
     646             (has-ode?      (or (not (null? (filter (lambda (x) (not (member (car x) kinetic))) states)))
     647                                (not (null? pool-ions)))))
     648
    723649
    724650           (pp indent ,nl (TITLE ,sysname))
     
    736662                              (USEION ,(first x) READ ,(third x) WRITE ,(second x))))))
    737663                     (delete-duplicates perm-ions (lambda (x y) (eq? (car x) (car y)))))
     664
    738665
    739666           (for-each (lambda (acc-ion)
     
    763690           (pp indent "}")
    764691           
    765            
    766            (pp indent ,nl (PARAMETER "{"))
    767            (let* ((const-defs (filter-map
    768                                (lambda (nv)
    769                                  (and (not (member (first nv) nmodl-builtin-consts))
    770                                       (let ((v1 (canonicalize-expr/NMODL (second nv))))
    771                                         (list (first nv) v1))))
    772                                    consts))
    773                   (locals  (find-locals (map second const-defs))))
    774              (if (not (null? locals)) (pp indent+ (LOCAL ,(sl\ ", " locals))))
    775              (for-each (lambda (def)
    776                          (let ((n (nmodl-name (first def))) (b (second def)))
    777                            (pp indent+ ,(expr->string/NMODL b n)))) const-defs)
    778              
    779              (case method  ((expeuler)  (pp indent+ dt)))
    780              (pp indent "}"))
    781            
    782692           (let* ((define-fn (make-define-fn table? min-v max-v table-with depend)))
    783693             (for-each (lambda (fndef)
     
    786696                       defuns))
    787697           
    788            
    789            (pp indent ,nl (STATE "{"))
    790            (for-each (lambda (st)
    791                        (if (pair? st)
    792                            (apply define-state (list indent+ (nmodl-state-name (first st) (second st))))
    793                            (apply define-state (list indent+ st))))
    794                      states)
    795            (for-each (lambda (st) (apply define-state (list indent+ st)))
    796                      reactions)
    797            (pp indent "}")
    798            
    799            (pp indent ,nl (ASSIGNED "{"))
    800            (let* ((asgns0 (append asgns (map first imports)
    801                                   (map second perm-ions) (map third perm-ions)
    802                                   (map second acc-ions)  (map fourth acc-ions)
    803                                   (map second pool-ions) (map third pool-ions)
    804                                   ))
    805                   (asgns1 (delete-duplicates asgns0)))
    806              (for-each (lambda (x) (pp indent+ ,(nmodl-name x))) asgns1)
     698           (let* ((parameter-defs
     699                   (filter-map
     700                    (lambda (nv)
     701                      (and (not (member (first nv) nmodl-builtin-consts))
     702                           (let ((v1 (canonicalize-expr/NMODL (second nv))))
     703                             (list (first nv) v1))))
     704                    consts))
     705                  (parameter-locals  (find-locals (map second parameter-defs)))
     706                  (state-defs
     707                   (append
     708                    (map (lambda (st)
     709                           (if (pair? st) (nmodl-state-name (first st) (second st))
     710                               (nmodl-name st)))
     711                         states)
     712                    (map nmodl-name reactions)))
     713                  (assigned-defs
     714                   (filter-map
     715                    (lambda (x)
     716                      (let ((x1 (nmodl-name x)))
     717                        (and (not (or (member x1 state-defs) (assoc x1 parameter-defs)))
     718                             x1)))
     719                    (delete-duplicates
     720                     (append asgns
     721                             (map first imports)
     722                             (map second perm-ions) (map third perm-ions)
     723                             (map second acc-ions)  (map fourth acc-ions)
     724                             (map second pool-ions) (map third pool-ions)
     725                             )))))
     726                 
     727             (pp indent ,nl (PARAMETER "{"))
     728             (if (not (null? parameter-locals)) (pp indent+ (LOCAL ,(sl\ ", " parameter-locals))))
     729             (for-each (lambda (def)
     730                         (let ((n (nmodl-name (first def))) (b (second def)))
     731                           (pp indent+ ,(expr->string/NMODL b n)))) parameter-defs)
     732             (case method  ((expeuler)  (pp indent+ dt)))
     733             (pp indent "}")
     734             (pp indent ,nl (STATE "{"))
     735             (for-each (lambda (x) (pp indent+ ,x)) state-defs)
     736             (pp indent "}")
     737             (pp indent ,nl (ASSIGNED "{"))
     738             (for-each (lambda (x) (pp indent+ ,x)) assigned-defs)
    807739             (pp indent "}"))
    808740           
     
    1012944               (pp indent "}")
    1013945
    1014                ))))
    1015         ))))
     946               ))))))
  • release/3/nemo/trunk/nemo.meta

    r12784 r13004  
    55 ; List here all the files that should be bundled as part of your egg. 
    66
    7  (files "nemo-core.scm" "nemo-utils.scm" "nemo-macros.scm"
     7 (files "nemo-core.scm" "nemo-utils.scm" "nemo-ionch.scm" "nemo-macros.scm"
    88        "expr.grm" "expr-parser.scm" "nemo.scm"
    99        "nemo-nmodl.scm" "nemo-matlab.scm" "extensions"
  • release/3/nemo/trunk/nemo.setup

    r12556 r13004  
    4545    ;(documentation "nemo.html")
    4646    ,@(if has-exports? `((exports "nemo-utils.exports")) (list)) ))
     47
     48
     49
     50(compile -O -d2 -s -o ,(dynld-name "nemo-ionch")
     51         ,@(if has-exports? '(-check-imports -emit-exports nemo-ionch.exports) '())
     52         nemo-ionch.scm)
     53
     54
     55(install-extension
     56
     57  ; Name of your extension:
     58  'nemo-ionch
     59
     60  ; Files to install for your extension:
     61  `(,(dynld-name "nemo-ionch")
     62    ,@(if has-exports? '("nemo-ionch.exports") (list)) )
     63
     64  ; Assoc list with properties for your extension:
     65  `((version 1.16)
     66    ;(documentation "nemo.html")
     67    ,@(if has-exports? `((exports "nemo-ionch.exports")) (list)) ))
    4768
    4869
Note: See TracChangeset for help on using the changeset viewer.