Artifact cc34f7c51ff148f7bde598a68e54766b8c7bc67b:


0000: 0a 28 72 65 71 75 69 72 65 2d 65 78 74 65 6e 73  .(require-extens
0010: 69 6f 6e 20 73 71 6c 69 74 65 33 20 72 65 67 65  ion sqlite3 rege
0020: 78 20 70 6f 73 69 78 20 65 66 6f 72 6d 61 74 20  x posix eformat 
0030: 73 69 6c 65 78 20 73 74 61 63 6b 20 72 65 67 65  silex stack rege
0040: 78 29 0a 0a 28 64 65 66 69 6e 65 20 68 65 6c 70  x)..(define help
0050: 20 22 0a 55 73 61 67 65 3a 20 6e 6c 64 62 20 5b   ".Usage: nldb [
0060: 6f 70 74 69 6f 6e 73 5d 0a 0a 0a 47 65 6e 65 72  options]...Gener
0070: 61 6c 0a 20 20 2d 68 20 20 20 20 20 20 20 20 20  al.  -h         
0080: 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 74               : t
0090: 68 69 73 20 68 65 6c 70 0a 0a 4e 65 74 6c 69 73  his help..Netlis
00a0: 74 20 64 61 74 61 20 71 75 65 72 69 65 73 0a 0a  t data queries..
00b0: 20 20 2d 66 69 6e 64 70 61 74 68 20 73 74 61 72    -findpath star
00c0: 74 2c 65 6e 64 20 20 20 20 20 3a 20 66 69 6e 64  t,end     : find
00d0: 20 70 61 74 68 20 66 72 6f 6d 20 73 74 61 72 74   path from start
00e0: 20 74 6f 20 65 6e 64 2e 20 25 20 69 73 20 61 20   to end. % is a 
00f0: 77 69 6c 64 63 61 72 64 0a 0a 4d 61 6e 61 67 69  wildcard..Managi
0100: 6e 67 20 6e 65 74 6c 69 73 74 20 64 61 74 61 0a  ng netlist data.
0110: 0a 20 20 2d 6c 6f 61 64 20 2f 70 61 74 68 2f 74  .  -load /path/t
0120: 6f 2f 6e 65 74 6c 69 73 74 20 20 3a 20 6c 6f 61  o/netlist  : loa
0130: 64 20 61 20 6d 6f 64 65 6c 20 69 6e 74 6f 20 74  d a model into t
0140: 68 65 20 64 62 0a 20 20 2d 64 20 64 62 6e 61 6d  he db.  -d dbnam
0150: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
0160: 3a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 2e 64  : name of the .d
0170: 62 20 66 69 6c 65 0a 20 20 2d 64 75 6d 70 20 66  b file.  -dump f
0180: 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  name            
0190: 20 3a 20 64 75 6d 70 20 74 68 65 20 6e 65 74 6c   : dump the netl
01a0: 69 73 74 20 69 6e 20 74 6f 20 76 65 72 69 6c 6f  ist in to verilo
01b0: 67 20 66 69 6c 65 0a 0a 22 29 0a 0a 28 69 6e 63  g file..")..(inc
01c0: 6c 75 64 65 20 22 2f 6e 66 73 2f 61 6e 2f 68 6f  lude "/nfs/an/ho
01d0: 6d 65 2f 6d 72 77 65 6c 6c 61 6e 2f 73 74 75 66  me/mrwellan/stuf
01e0: 66 2f 74 6f 6f 6c 73 2f 6c 6e 6b 6d 6b 72 2f 61  f/tools/lnkmkr/a
01f0: 72 67 73 2e 73 63 6d 22 29 0a 28 69 6e 63 6c 75  rgs.scm").(inclu
0200: 64 65 20 22 76 65 72 69 6c 6f 67 2e 6c 2e 73 63  de "verilog.l.sc
0210: 6d 22 29 0a 0a 3b 3b 20 70 72 6f 63 65 73 73 20  m")..;; process 
0220: 61 72 67 73 0a 28 64 65 66 69 6e 65 20 72 65 6d  args.(define rem
0230: 61 72 67 73 20 28 67 65 74 2d 61 72 67 73 20 28  args (get-args (
0240: 61 72 67 76 29 0a 09 09 09 20 20 28 6c 69 73 74  argv)....  (list
0250: 20 22 2d 6c 6f 61 64 22 0a 09 09 09 09 22 2d 64   "-load"....."-d
0260: 22 20 20 20 20 20 20 20 20 20 20 22 2d 64 75 6d  "          "-dum
0270: 70 22 20 0a 09 09 09 09 22 2d 66 69 6e 64 70 61  p" ....."-findpa
0280: 74 68 22 29 0a 09 09 09 20 20 0a 09 09 09 20 20  th")....  ....  
0290: 28 6c 69 73 74 20 22 2d 68 22 0a 09 09 09 09 29  (list "-h".....)
02a0: 0a 09 09 09 20 20 61 72 67 2d 68 61 73 68 0a 09  ....  arg-hash..
02b0: 09 09 20 20 30 29 29 20 3b 3b 0a 0a 28 64 65 66  ..  0)) ;;..(def
02c0: 69 6e 65 20 64 62 70 61 74 68 73 20 28 6c 69 73  ine dbpaths (lis
02d0: 74 20 22 74 65 73 74 69 6e 67 2e 64 62 22 29 29  t "testing.db"))
02e0: 0a 0a 28 64 65 66 69 6e 65 20 64 62 70 61 74 68  ..(define dbpath
02f0: 20 23 66 29 0a 0a 28 69 66 20 28 67 65 74 2d 61   #f)..(if (get-a
0300: 72 67 20 22 2d 64 22 29 0a 20 20 20 20 28 73 65  rg "-d").    (se
0310: 74 21 20 64 62 70 61 74 68 20 28 67 65 74 2d 61  t! dbpath (get-a
0320: 72 67 20 22 2d 64 22 29 29 0a 20 20 20 20 28 66  rg "-d")).    (f
0330: 6f 72 2d 65 61 63 68 0a 20 20 20 20 20 28 6c 61  or-each.     (la
0340: 6d 62 64 61 20 28 70 61 74 68 29 0a 20 20 20 20  mbda (path).    
0350: 20 20 20 28 69 66 20 28 66 69 6c 65 2d 65 78 69     (if (file-exi
0360: 73 74 73 3f 20 70 61 74 68 29 0a 09 20 20 20 28  sts? path)..   (
0370: 73 65 74 21 20 64 62 70 61 74 68 20 70 61 74 68  set! dbpath path
0380: 29 29 29 0a 20 20 20 20 20 64 62 70 61 74 68 73  ))).     dbpaths
0390: 29 29 0a 0a 28 69 66 20 28 61 6e 64 20 28 6e 6f  ))..(if (and (no
03a0: 74 20 64 62 70 61 74 68 29 20 28 67 65 74 2d 61  t dbpath) (get-a
03b0: 72 67 20 22 2d 64 22 29 29 0a 20 20 20 20 28 62  rg "-d")).    (b
03c0: 65 67 69 6e 0a 20 20 20 20 20 20 28 70 72 69 6e  egin.      (prin
03d0: 74 20 22 43 61 6e 27 74 20 66 69 6e 64 20 64 62  t "Can't find db
03e0: 2e 20 22 20 28 67 65 74 2d 61 72 67 20 22 2d 64  . " (get-arg "-d
03f0: 22 29 20 22 20 54 72 79 20 61 67 61 69 6e 20 6f  ") " Try again o
0400: 72 20 63 6f 6e 74 61 63 74 20 4d 61 74 74 21 22  r contact Matt!"
0410: 29 0a 20 20 20 20 20 20 28 65 78 69 74 20 31 29  ).      (exit 1)
0420: 29 29 0a 0a 28 64 65 66 69 6e 65 20 64 62 65 78  ))..(define dbex
0430: 69 73 74 73 20 28 66 69 6c 65 2d 65 78 69 73 74  ists (file-exist
0440: 73 3f 20 64 62 70 61 74 68 29 29 0a 0a 28 64 65  s? dbpath))..(de
0450: 66 69 6e 65 20 72 65 61 6c 75 73 65 72 20 28 67  fine realuser (g
0460: 65 74 65 6e 76 20 22 55 53 45 52 22 29 29 0a 28  etenv "USER")).(
0470: 64 65 66 69 6e 65 20 75 73 65 72 20 72 65 61 6c  define user real
0480: 75 73 65 72 29 0a 0a 28 64 65 66 69 6e 65 20 64  user)..(define d
0490: 62 20 28 73 71 6c 69 74 65 33 3a 6f 70 65 6e 20  b (sqlite3:open 
04a0: 64 62 70 61 74 68 29 29 0a 28 73 71 6c 69 74 65  dbpath)).(sqlite
04b0: 33 3a 73 65 74 2d 62 75 73 79 2d 74 69 6d 65 6f  3:set-busy-timeo
04c0: 75 74 21 20 64 62 20 31 30 30 30 30 30 30 29 0a  ut! db 1000000).
04d0: 0a 28 64 65 66 69 6e 65 20 28 6d 6b 2d 74 61 62  .(define (mk-tab
04e0: 6c 65 73 29 0a 20 20 28 66 6f 72 2d 65 61 63 68  les).  (for-each
04f0: 0a 20 20 20 28 6c 61 6d 62 64 61 20 28 73 71 6c  .   (lambda (sql
0500: 73 74 6d 74 29 0a 20 20 20 20 20 28 73 71 6c 69  stmt).     (sqli
0510: 74 65 33 3a 65 78 65 63 20 64 62 20 73 71 6c 73  te3:exec db sqls
0520: 74 6d 74 29 29 0a 20 20 20 28 6c 69 73 74 20 22  tmt)).   (list "
0530: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d 6f 64  CREATE TABLE mod
0540: 75 6c 65 73 28 69 64 20 49 4e 54 45 47 45 52 20  ules(id INTEGER 
0550: 50 52 49 4d 41 52 59 20 4b 45 59 2c 6e 61 6d 65  PRIMARY KEY,name
0560: 5f 69 64 20 49 4e 54 45 47 45 52 29 3b 22 0a 09  _id INTEGER);"..
0570: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 6e   "CREATE TABLE n
0580: 65 74 73 20 20 20 28 69 64 20 49 4e 54 45 47 45  ets   (id INTEGE
0590: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 6e 61  R PRIMARY KEY,na
05a0: 6d 65 5f 69 64 20 49 4e 54 45 47 45 52 2c 6d 6f  me_id INTEGER,mo
05b0: 64 75 6c 65 5f 69 64 20 49 4e 54 45 47 45 52 29  dule_id INTEGER)
05c0: 3b 22 0a 09 20 22 43 52 45 41 54 45 20 54 41 42  ;".. "CREATE TAB
05d0: 4c 45 20 69 6e 73 74 73 20 20 28 69 64 20 49 4e  LE insts  (id IN
05e0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
05f0: 59 2c 6e 61 6d 65 5f 69 64 20 49 4e 54 45 47 45  Y,name_id INTEGE
0600: 52 2c 6d 6f 64 75 6c 65 5f 69 64 20 49 4e 54 45  R,module_id INTE
0610: 47 45 52 2c 70 61 72 65 6e 74 5f 69 64 20 49 4e  GER,parent_id IN
0620: 54 45 47 45 52 29 3b 22 0a 09 20 22 43 52 45 41  TEGER);".. "CREA
0630: 54 45 20 54 41 42 4c 45 20 70 69 6e 73 20 20 20  TE TABLE pins   
0640: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  (id INTEGER PRIM
0650: 41 52 59 20 4b 45 59 2c 6e 61 6d 65 5f 69 64 20  ARY KEY,name_id 
0660: 49 4e 54 45 47 45 52 2c 6d 6f 64 75 6c 65 5f 69  INTEGER,module_i
0670: 64 20 49 4e 54 45 47 45 52 2c 6e 65 74 5f 69 64  d INTEGER,net_id
0680: 20 49 4e 54 45 47 45 52 2c 74 79 70 65 5f 69 64   INTEGER,type_id
0690: 20 49 4e 54 45 47 45 52 29 3b 22 0a 09 20 22 43   INTEGER);".. "C
06a0: 52 45 41 54 45 20 54 41 42 4c 45 20 63 6f 6e 6e  REATE TABLE conn
06b0: 73 20 20 28 69 64 20 49 4e 54 45 47 45 52 20 50  s  (id INTEGER P
06c0: 52 49 4d 41 52 59 20 4b 45 59 2c 6e 65 74 5f 69  RIMARY KEY,net_i
06d0: 64 20 20 49 4e 54 45 47 45 52 2c 69 6e 73 74 5f  d  INTEGER,inst_
06e0: 69 64 20 49 4e 54 45 47 45 52 2c 70 69 6e 5f 69  id INTEGER,pin_i
06f0: 64 20 49 4e 54 45 47 45 52 29 3b 22 0a 09 20 22  d INTEGER);".. "
0700: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6e 61 6d  CREATE TABLE nam
0710: 65 73 20 20 28 69 64 20 49 4e 54 45 47 45 52 20  es  (id INTEGER 
0720: 50 52 49 4d 41 52 59 20 4b 45 59 2c 6e 61 6d 65  PRIMARY KEY,name
0730: 20 54 45 58 54 29 3b 22 0a 09 20 22 43 52 45 41   TEXT);".. "CREA
0740: 54 45 20 54 41 42 4c 45 20 74 79 70 65 73 28 69  TE TABLE types(i
0750: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  d INTEGER PRIMAR
0760: 59 20 4b 45 59 2c 74 79 70 65 20 54 45 58 54 29  Y KEY,type TEXT)
0770: 3b 22 0a 09 20 22 49 4e 53 45 52 54 20 49 4e 54  ;".. "INSERT INT
0780: 4f 20 74 79 70 65 73 20 56 41 4c 55 45 53 28 31  O types VALUES(1
0790: 2c 20 27 75 6e 64 65 66 27 29 3b 22 0a 09 20 22  , 'undef');".. "
07a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 79 70 65  INSERT INTO type
07b0: 73 20 56 41 4c 55 45 53 28 32 2c 20 27 69 6e 70  s VALUES(2, 'inp
07c0: 75 74 27 29 3b 22 0a 09 20 22 49 4e 53 45 52 54  ut');".. "INSERT
07d0: 20 49 4e 54 4f 20 74 79 70 65 73 20 56 41 4c 55   INTO types VALU
07e0: 45 53 28 33 2c 20 27 6f 75 74 70 75 74 27 29 3b  ES(3, 'output');
07f0: 22 0a 09 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  ".. "INSERT INTO
0800: 20 74 79 70 65 73 20 56 41 4c 55 45 53 28 34 2c   types VALUES(4,
0810: 20 27 69 6e 6f 75 74 27 29 3b 22 0a 09 20 22 49   'inout');".. "I
0820: 4e 53 45 52 54 20 49 4e 54 4f 20 74 79 70 65 73  NSERT INTO types
0830: 20 56 41 4c 55 45 53 28 35 2c 20 27 70 77 72 27   VALUES(5, 'pwr'
0840: 29 3b 22 0a 09 20 22 50 52 41 47 4d 41 20 73 79  );".. "PRAGMA sy
0850: 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 22 29  nchronous=OFF;")
0860: 29 29 0a 0a 28 69 66 20 28 6e 6f 74 20 64 62 65  ))..(if (not dbe
0870: 78 69 73 74 73 29 28 6d 6b 2d 74 61 62 6c 65 73  xists)(mk-tables
0880: 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ))..;;==========
0890: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
08a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
08b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
08c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20  ============.;; 
08d0: 4e 45 54 4c 49 53 54 20 52 45 41 44 49 4e 47 0a  NETLIST READING.
08e0: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
08f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0900: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0910: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0920: 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 55 73 65  ========..;; Use
0930: 20 61 20 73 74 61 63 6b 20 74 6f 20 74 72 61 63   a stack to trac
0940: 6b 69 6e 67 20 73 74 61 74 65 0a 3b 3b 0a 28 64  king state.;;.(d
0950: 65 66 69 6e 65 20 6e 6c 64 62 3a 2a 73 74 61 63  efine nldb:*stac
0960: 6b 2a 20 28 6d 61 6b 65 2d 73 74 61 63 6b 29 29  k* (make-stack))
0970: 0a 0a 28 64 65 66 69 6e 65 20 28 6e 6c 64 62 3a  ..(define (nldb:
0980: 72 65 61 64 2d 66 69 6c 65 73 20 66 6e 61 6d 65  read-files fname
0990: 73 29 20 3b 3b 20 72 65 61 64 20 69 6e 20 61 20  s) ;; read in a 
09a0: 6c 69 73 74 20 6f 66 20 66 69 6c 65 73 0a 20 20  list of files.  
09b0: 28 66 6f 72 2d 65 61 63 68 20 0a 20 20 20 28 6c  (for-each .   (l
09c0: 61 6d 62 64 61 20 28 66 6e 61 6d 65 29 0a 20 20  ambda (fname).  
09d0: 20 20 20 28 69 66 20 28 66 69 6c 65 2d 65 78 69     (if (file-exi
09e0: 73 74 73 3f 20 66 6e 61 6d 65 29 0a 09 20 28 6e  sts? fname).. (n
09f0: 6c 64 62 3a 72 65 61 64 2d 66 69 6c 65 20 66 6e  ldb:read-file fn
0a00: 61 6d 65 29 29 29 0a 20 20 20 66 6e 61 6d 65 73  ame))).   fnames
0a10: 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ))..;;==========
0a20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0a30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0a40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0a50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20  ============.;; 
0a60: 50 52 45 43 4f 4d 50 49 4c 45 44 20 52 45 47 45  PRECOMPILED REGE
0a70: 58 53 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  XS.;;===========
0a80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0a90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0aa0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0ab0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65  ===========..(de
0ac0: 66 69 6e 65 20 6e 6c 64 62 3a 65 73 63 61 70 65  fine nldb:escape
0ad0: 64 2d 6e 61 6d 65 20 20 20 20 20 28 72 65 67 65  d-name     (rege
0ae0: 78 70 20 22 5e 5c 5c 73 2a 5c 5c 5c 5c 28 5b 5e  xp "^\\s*\\\\([^
0af0: 5c 5c 73 5d 2b 29 5c 5c 73 2a 22 29 29 0a 28 64  \\s]+)\\s*")).(d
0b00: 65 66 69 6e 65 20 6e 6c 64 62 3a 74 72 61 69 6c  efine nldb:trail
0b10: 69 6e 67 2d 67 61 72 62 61 67 65 20 28 72 65 67  ing-garbage (reg
0b20: 65 78 70 20 22 5e 5c 5c 73 2a 28 5b 5e 5c 5c 73  exp "^\\s*([^\\s
0b30: 2c 3b 5d 2b 29 5b 2c 3b 5c 5c 73 5d 2a 24 22 29  ,;]+)[,;\\s]*$")
0b40: 29 0a 28 64 65 66 69 6e 65 20 6e 6c 64 62 3a 6d  ).(define nldb:m
0b50: 6f 64 75 6c 65 2d 70 69 6e 20 20 20 20 20 20 20  odule-pin       
0b60: 28 72 65 67 65 78 70 20 22 5e 5c 5c 73 2a 28 5b  (regexp "^\\s*([
0b70: 5e 5c 5c 73 5d 2b 29 5c 5c 73 2a 28 5b 2c 5c 5c  ^\\s]+)\\s*([,\\
0b80: 73 5c 5c 29 5d 2a 29 22 29 29 0a 28 64 65 66 69  s\\)]*)")).(defi
0b90: 6e 65 20 6e 6c 64 62 3a 70 69 6e 73 2d 65 6e 64  ne nldb:pins-end
0ba0: 20 20 20 20 20 20 20 20 20 28 72 65 67 65 78 70           (regexp
0bb0: 20 22 5c 5c 29 5c 5c 73 2a 3b 22 29 29 0a 28 64   "\\)\\s*;")).(d
0bc0: 65 66 69 6e 65 20 6e 6c 64 62 3a 69 6e 70 75 74  efine nldb:input
0bd0: 2d 6f 75 74 70 75 74 20 20 20 20 20 28 72 65 67  -output     (reg
0be0: 65 78 70 20 22 5c 5c 73 2a 28 69 6e 70 75 74 7c  exp "\\s*(input|
0bf0: 6f 75 74 70 75 74 29 5c 5c 73 2b 28 5b 5e 5c 5c  output)\\s+([^\\
0c00: 73 5d 2b 29 5b 5c 5c 73 3b 2c 5d 22 29 29 0a 0a  s]+)[\\s;,]"))..
0c10: 3b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;;              
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64               mod
0c40: 6e 61 6d 65 20 69 6e 73 74 6e 61 6d 65 28 20 2e  name instname( .
0c50: 5c 70 69 6e 6e 61 6d 65 5b 33 35 5d 20 28 5c 6e  \pinname[35] (\n
0c60: 65 74 6e 61 6d 65 20 29 2c 0a 28 64 65 66 69 6e  etname ),.(defin
0c70: 65 20 6e 6c 64 62 3a 69 6e 73 74 61 6e 63 65 20  e nldb:instance 
0c80: 20 20 20 20 20 20 20 20 28 72 65 67 65 78 70 20          (regexp 
0c90: 22 5e 5c 5c 73 2a 28 5b 5e 5c 5c 73 5d 2b 29 5c  "^\\s*([^\\s]+)\
0ca0: 5c 73 2b 28 5b 5e 5c 5c 73 5d 2b 29 5c 5c 73 2a  \s+([^\\s]+)\\s*
0cb0: 5c 5c 28 5c 5c 73 2a 5c 5c 2e 28 5b 5e 5c 5c 73  \\(\\s*\\.([^\\s
0cc0: 5d 2b 29 5c 5c 73 2a 5c 5c 28 5c 5c 73 2a 28 5b  ]+)\\s*\\(\\s*([
0cd0: 5e 5c 5c 73 5d 2b 29 5c 5c 73 2a 5c 5c 29 5c 5c  ^\\s]+)\\s*\\)\\
0ce0: 73 2a 2c 22 29 29 0a 28 64 65 66 69 6e 65 20 6e  s*,")).(define n
0cf0: 6c 64 62 3a 69 6e 73 74 2d 63 6f 6e 6e 20 20 20  ldb:inst-conn   
0d00: 20 20 20 20 20 28 72 65 67 65 78 70 20 22 5e 5c       (regexp "^\
0d10: 5c 73 2a 5c 5c 2e 28 5b 5e 5c 5c 73 5d 2b 29 5c  \s*\\.([^\\s]+)\
0d20: 5c 73 2a 5c 5c 28 5c 5c 73 2a 28 5b 5e 5c 5c 73  \s*\\(\\s*([^\\s
0d30: 5d 29 2b 5c 5c 73 2b 5c 5c 29 5c 5c 73 2a 28 5b  ])+\\s+\\)\\s*([
0d40: 5c 5c 29 2c 3b 5d 2b 29 22 29 29 0a 0a 3b 3b 20  \\),;]+)"))..;; 
0d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d80: 6d 6f 64 75 6c 65 5f 6e 61 6d 65 20 20 20 20 20  module_name     
0d90: 20 20 20 20 6e 65 74 6e 61 6d 65 20 28 6f 70 74      netname (opt
0da0: 29 0a 28 64 65 66 69 6e 65 20 6e 6c 64 62 3a 6d  ).(define nldb:m
0db0: 6f 64 75 6c 65 2d 72 65 67 65 78 20 28 72 65 67  odule-regex (reg
0dc0: 65 78 70 20 22 5e 5c 5c 73 2a 6d 6f 64 75 6c 65  exp "^\\s*module
0dd0: 5c 5c 73 2b 28 5b 5e 5c 5c 73 5d 2b 29 5c 5c 73  \\s+([^\\s]+)\\s
0de0: 2a 5c 5c 28 5c 5c 73 2a 28 5b 5e 5c 5c 73 2c 5d  *\\(\\s*([^\\s,]
0df0: 2b 5c 5c 73 2a 2c 7c 29 24 22 29 29 0a 0a 3b 3b  +\\s*,|)$"))..;;
0e00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0e10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0e20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0e30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0e40: 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 4d 49 53 43 0a 3b  ======.;; MISC.;
0e50: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
0e60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0e70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0e80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0e90: 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 61 70 70 6c  =======..;; appl
0ea0: 79 20 72 65 67 65 78 20 61 6e 64 20 73 65 74 20  y regex and set 
0eb0: 6e 6c 64 62 3a 6d 61 74 63 68 2d 76 61 6c 0a 28  nldb:match-val.(
0ec0: 64 65 66 69 6e 65 20 6e 6c 64 62 3a 6d 61 74 63  define nldb:matc
0ed0: 68 2d 76 61 6c 20 23 66 29 0a 28 64 65 66 69 6e  h-val #f).(defin
0ee0: 65 20 28 6e 6c 64 62 3a 72 65 67 65 78 2d 6d 61  e (nldb:regex-ma
0ef0: 74 63 68 20 72 20 6c 29 0a 20 20 28 6c 65 74 20  tch r l).  (let 
0f00: 28 28 6d 20 28 73 74 72 69 6e 67 2d 6d 61 74 63  ((m (string-matc
0f10: 68 20 72 20 6c 29 29 29 0a 20 20 20 20 28 73 65  h r l))).    (se
0f20: 74 21 20 6e 6c 64 62 3a 6d 61 74 63 68 2d 76 61  t! nldb:match-va
0f30: 6c 20 6d 29 20 6d 29 29 0a 0a 3b 3b 20 73 74 6d  l m) m))..;; stm
0f40: 74 20 63 61 6e 20 6f 6e 6c 79 20 72 65 74 75 72  t can only retur
0f50: 6e 20 2a 6f 6e 65 2a 20 76 61 6c 75 65 21 21 0a  n *one* value!!.
0f60: 28 64 65 66 69 6e 65 20 28 6e 6c 64 62 3a 73 71  (define (nldb:sq
0f70: 6c 69 74 65 33 3a 67 65 74 2d 6f 6e 65 20 73 74  lite3:get-one st
0f80: 6d 74 20 2e 20 70 61 72 61 6d 73 29 0a 20 20 28  mt . params).  (
0f90: 6c 65 74 20 28 28 73 71 6c 73 74 6d 74 20 28 73  let ((sqlstmt (s
0fa0: 71 6c 69 74 65 33 3a 70 72 65 70 61 72 65 20 64  qlite3:prepare d
0fb0: 62 20 73 74 6d 74 29 29 0a 09 28 72 65 73 75 6c  b stmt))..(resul
0fc0: 74 20 20 23 66 29 29 0a 20 20 20 20 28 61 70 70  t  #f)).    (app
0fd0: 6c 79 20 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65  ly sqlite3:for-e
0fe0: 61 63 68 2d 72 6f 77 0a 09 20 20 20 28 6c 61 6d  ach-row..   (lam
0ff0: 62 64 61 20 28 78 29 0a 09 20 20 20 20 20 28 73  bda (x)..     (s
1000: 65 74 21 20 72 65 73 75 6c 74 20 78 29 29 20 73  et! result x)) s
1010: 71 6c 73 74 6d 74 20 70 61 72 61 6d 73 29 0a 20  qlstmt params). 
1020: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 69 6e 61     (sqlite3:fina
1030: 6c 69 7a 65 21 20 73 71 6c 73 74 6d 74 29 0a 20  lize! sqlstmt). 
1040: 20 20 20 72 65 73 75 6c 74 29 29 0a 0a 3b 3b 3d     result))..;;=
1050: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1060: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1070: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1080: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1090: 3d 3d 3d 3d 3d 0a 3b 3b 20 43 41 43 48 45 0a 3b  =====.;; CACHE.;
10a0: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
10b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
10c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
10d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
10e0: 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65  =======..(define
10f0: 20 2a 63 61 63 68 65 2a 20 20 20 20 20 20 20 20   *cache*        
1100: 20 20 20 20 20 28 6d 61 6b 65 2d 68 61 73 68 2d       (make-hash-
1110: 74 61 62 6c 65 29 29 0a 28 64 65 66 69 6e 65 20  table)).(define 
1120: 2a 6d 6f 64 75 6c 65 2d 6e 61 6d 65 2d 63 61 63  *module-name-cac
1130: 68 65 2a 20 28 6d 61 6b 65 2d 68 61 73 68 2d 74  he* (make-hash-t
1140: 61 62 6c 65 29 29 0a 0a 28 64 65 66 69 6e 65 20  able))..(define 
1150: 28 63 61 63 68 65 2d 67 65 74 2d 6d 6f 64 75 6c  (cache-get-modul
1160: 65 2d 68 61 73 68 20 6d 6f 64 75 6c 65 29 0a 20  e-hash module). 
1170: 20 28 73 75 62 2d 68 61 73 68 2d 63 72 65 61 74   (sub-hash-creat
1180: 65 2d 67 65 74 20 2a 63 61 63 68 65 2a 20 6d 6f  e-get *cache* mo
1190: 64 75 6c 65 29 29 0a 0a 28 64 65 66 69 6e 65 20  dule))..(define 
11a0: 28 73 75 62 2d 68 61 73 68 2d 63 72 65 61 74 65  (sub-hash-create
11b0: 2d 67 65 74 20 73 75 62 68 61 73 68 20 6b 65 79  -get subhash key
11c0: 29 0a 20 20 28 6c 65 74 20 28 28 73 68 61 73 68  ).  (let ((shash
11d0: 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 67 65 74   (hash-table-get
11e0: 2f 64 65 66 61 75 6c 74 20 73 75 62 68 61 73 68  /default subhash
11f0: 20 6b 65 79 29 29 29 0a 20 20 20 20 28 69 66 20   key))).    (if 
1200: 73 68 61 73 68 20 73 68 61 73 68 0a 09 28 6c 65  shash shash..(le
1210: 74 20 28 28 6e 65 77 68 20 28 6d 61 6b 65 2d 68  t ((newh (make-h
1220: 61 73 68 2d 74 61 62 6c 65 29 29 29 0a 09 20 20  ash-table)))..  
1230: 28 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74 21  (hash-table-set!
1240: 20 73 75 62 68 61 73 68 20 6b 65 79 20 6e 65 77   subhash key new
1250: 68 29 0a 09 20 20 6e 65 77 68 29 29 29 29 0a 0a  h)..  newh))))..
1260: 3b 3b 20 28 63 61 63 68 65 2d 73 65 74 21 20 22  ;; (cache-set! "
1270: 61 62 63 5f 61 64 64 65 72 22 20 27 70 69 6e 20  abc_adder" 'pin 
1280: 22 61 64 64 72 69 6e 22 20 30 29 0a 28 64 65 66  "addrin" 0).(def
1290: 69 6e 65 20 28 63 61 63 68 65 2d 73 65 74 21 20  ine (cache-set! 
12a0: 6d 6f 64 75 6c 65 20 6f 62 6a 74 79 70 65 20 6f  module objtype o
12b0: 62 6a 6e 61 6d 65 20 76 61 6c 75 65 29 0a 20 20  bjname value).  
12c0: 28 6c 65 74 2a 20 28 28 6d 68 61 73 68 20 28 63  (let* ((mhash (c
12d0: 61 63 68 65 2d 67 65 74 2d 6d 6f 64 75 6c 65 2d  ache-get-module-
12e0: 68 61 73 68 20 6d 6f 64 75 6c 65 29 29 0a 09 20  hash module)).. 
12f0: 28 74 68 61 73 68 20 28 73 75 62 2d 68 61 73 68  (thash (sub-hash
1300: 2d 63 72 65 61 74 65 2d 67 65 74 20 6d 68 61 73  -create-get mhas
1310: 68 20 6f 62 6a 74 79 70 65 29 29 29 0a 20 20 20  h objtype))).   
1320: 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74   (hash-table-set
1330: 21 20 74 68 61 73 68 20 6f 62 6a 6e 61 6d 65 20  ! thash objname 
1340: 76 61 6c 75 65 29 29 29 0a 0a 28 64 65 66 69 6e  value)))..(defin
1350: 65 20 28 63 61 63 68 65 2d 72 65 66 20 6d 6f 64  e (cache-ref mod
1360: 75 6c 65 20 6f 62 6a 74 79 70 65 20 6f 62 6a 6e  ule objtype objn
1370: 61 6d 65 29 0a 20 20 28 6c 65 74 20 28 28 6d 68  ame).  (let ((mh
1380: 61 73 68 20 28 68 61 73 68 2d 74 61 62 6c 65 2d  ash (hash-table-
1390: 72 65 66 2f 64 65 66 61 75 6c 74 20 2a 63 61 63  ref/default *cac
13a0: 68 65 2a 20 6d 6f 64 75 6c 65 29 29 29 0a 20 20  he* module))).  
13b0: 20 20 28 69 66 20 6d 68 61 73 68 0a 09 28 6c 65    (if mhash..(le
13c0: 74 20 28 28 6f 68 61 73 68 20 28 68 61 73 68 2d  t ((ohash (hash-
13d0: 74 61 62 6c 65 2d 72 65 66 2f 64 65 66 61 75 6c  table-ref/defaul
13e0: 74 20 6d 68 61 73 68 20 6f 62 6a 74 79 70 65 29  t mhash objtype)
13f0: 29 29 0a 09 20 20 28 69 66 20 6f 68 61 73 68 0a  ))..  (if ohash.
1400: 09 20 20 20 20 20 20 28 68 61 73 68 2d 74 61 62  .      (hash-tab
1410: 6c 65 2d 72 65 66 2f 64 65 66 61 75 6c 74 20 6f  le-ref/default o
1420: 68 61 73 68 20 6f 62 6a 6e 61 6d 65 29 0a 09 20  hash objname).. 
1430: 20 20 20 20 20 23 66 29 29 0a 09 23 66 29 29 29       #f))..#f)))
1440: 0a 20 20 20 20 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d  .    .;;========
1450: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1460: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1470: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1480: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b  ==============.;
1490: 3b 20 4e 41 4d 45 53 0a 3b 3b 3d 3d 3d 3d 3d 3d  ; NAMES.;;======
14a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
14b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
14c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
14d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
14e0: 0a 0a 28 64 65 66 69 6e 65 20 6e 6c 64 62 3a 6e  ..(define nldb:n
14f0: 61 6d 65 73 2d 68 61 73 68 20 28 6d 61 6b 65 2d  ames-hash (make-
1500: 68 61 73 68 2d 74 61 62 6c 65 29 29 0a 0a 3b 3b  hash-table))..;;
1510: 20 61 6c 77 61 79 73 20 73 75 63 65 73 73 66 75   always sucessfu
1520: 6c 2e 20 69 6e 73 65 72 74 73 20 6e 61 6d 65 20  l. inserts name 
1530: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 0a 28 64 65  if not found.(de
1540: 66 69 6e 65 20 28 6e 6c 64 62 3a 67 65 74 2d 6e  fine (nldb:get-n
1550: 61 6d 65 2d 69 64 20 6e 61 6d 65 29 0a 20 20 28  ame-id name).  (
1560: 6c 65 74 20 28 28 63 61 63 68 65 64 2d 69 64 20  let ((cached-id 
1570: 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f  (hash-table-ref/
1580: 64 65 66 61 75 6c 74 20 6e 6c 64 62 3a 6e 61 6d  default nldb:nam
1590: 65 73 2d 68 61 73 68 20 6e 61 6d 65 20 23 66 29  es-hash name #f)
15a0: 29 29 0a 20 20 20 20 28 69 66 20 63 61 63 68 65  )).    (if cache
15b0: 64 2d 69 64 20 63 61 63 68 65 64 2d 69 64 0a 09  d-id cached-id..
15c0: 28 6c 65 74 20 28 28 69 64 20 28 6e 6c 64 62 3a  (let ((id (nldb:
15d0: 73 71 6c 69 74 65 33 3a 67 65 74 2d 6f 6e 65 20  sqlite3:get-one 
15e0: 22 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20  "SELECT id FROM 
15f0: 6e 61 6d 65 73 20 57 48 45 52 45 20 6e 61 6d 65  names WHERE name
1600: 3d 3f 3b 22 20 6e 61 6d 65 29 29 29 0a 09 20 20  =?;" name)))..  
1610: 28 69 66 20 69 64 0a 09 20 20 20 20 20 20 28 62  (if id..      (b
1620: 65 67 69 6e 0a 09 09 28 68 61 73 68 2d 74 61 62  egin...(hash-tab
1630: 6c 65 2d 73 65 74 21 20 6e 6c 64 62 3a 6e 61 6d  le-set! nldb:nam
1640: 65 73 2d 68 61 73 68 20 6e 61 6d 65 20 69 64 20  es-hash name id 
1650: 29 0a 09 09 69 64 29 0a 09 20 20 20 20 20 20 28  )...id)..      (
1660: 62 65 67 69 6e 0a 09 09 28 73 71 6c 69 74 65 33  begin...(sqlite3
1670: 3a 65 78 65 63 20 64 62 20 22 49 4e 53 45 52 54  :exec db "INSERT
1680: 20 49 4e 54 4f 20 6e 61 6d 65 73 20 28 6e 61 6d   INTO names (nam
1690: 65 29 20 56 41 4c 55 45 53 20 28 3f 29 3b 22 20  e) VALUES (?);" 
16a0: 6e 61 6d 65 29 0a 09 09 28 6e 6c 64 62 3a 67 65  name)...(nldb:ge
16b0: 74 2d 6e 61 6d 65 2d 69 64 20 6e 61 6d 65 29 29  t-name-id name))
16c0: 29 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  )))))..(define (
16d0: 6e 6c 64 62 3a 63 6c 65 61 6e 2d 6e 61 6d 65 20  nldb:clean-name 
16e0: 6e 61 6d 65 29 0a 20 20 28 69 66 20 28 6e 6c 64  name).  (if (nld
16f0: 62 3a 72 65 67 65 78 2d 6d 61 74 63 68 20 6e 6c  b:regex-match nl
1700: 64 62 3a 65 73 63 61 70 65 64 2d 6e 61 6d 65 20  db:escaped-name 
1710: 6e 61 6d 65 29 20 3b 3b 20 70 72 6f 63 65 73 73  name) ;; process
1720: 20 65 73 63 61 70 65 64 20 69 64 65 6e 74 69 66   escaped identif
1730: 69 65 72 73 0a 20 20 20 20 20 20 28 6c 69 73 74  iers.      (list
1740: 2d 72 65 66 20 6e 6c 64 62 3a 6d 61 74 63 68 2d  -ref nldb:match-
1750: 76 61 6c 20 31 29 0a 20 20 20 20 20 20 28 69 66  val 1).      (if
1760: 20 28 6e 6c 64 62 3a 72 65 67 65 78 2d 6d 61 74   (nldb:regex-mat
1770: 63 68 20 6e 6c 64 62 3a 74 72 61 69 6c 69 6e 67  ch nldb:trailing
1780: 2d 67 61 72 62 61 67 65 20 6e 61 6d 65 29 0a 09  -garbage name)..
1790: 20 20 28 6c 69 73 74 2d 72 65 66 20 6e 6c 64 62    (list-ref nldb
17a0: 3a 6d 61 74 63 68 2d 76 61 6c 20 31 29 0a 09 20  :match-val 1).. 
17b0: 20 6e 61 6d 65 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d   name)))..;;====
17c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
17d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
17e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
17f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1800: 3d 3d 0a 3b 3b 20 4d 4f 44 55 4c 45 53 0a 3b 3b  ==.;; MODULES.;;
1810: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1820: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1830: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1840: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1850: 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 61 64 64 20 61  ======..;; add a
1860: 20 6d 6f 64 75 6c 65 20 61 6e 64 20 72 65 74 75   module and retu
1870: 72 6e 20 69 74 73 20 69 64 2e 0a 28 64 65 66 69  rn its id..(defi
1880: 6e 65 20 28 6e 6c 64 62 3a 67 65 74 2d 6d 6f 64  ne (nldb:get-mod
1890: 75 6c 65 2d 69 64 20 6e 61 6d 65 2d 69 64 29 0a  ule-id name-id).
18a0: 20 20 28 6c 65 74 20 28 28 69 64 20 20 28 6e 6c    (let ((id  (nl
18b0: 64 62 3a 73 71 6c 69 74 65 33 3a 67 65 74 2d 6f  db:sqlite3:get-o
18c0: 6e 65 20 0a 09 20 20 20 20 20 20 22 53 45 4c 45  ne ..      "SELE
18d0: 43 54 20 69 64 20 46 52 4f 4d 20 6d 6f 64 75 6c  CT id FROM modul
18e0: 65 73 20 57 48 45 52 45 20 6e 61 6d 65 5f 69 64  es WHERE name_id
18f0: 3d 3f 3b 22 20 6e 61 6d 65 2d 69 64 29 29 29 0a  =?;" name-id))).
1900: 20 20 20 20 28 69 66 20 69 64 20 69 64 0a 09 28      (if id id..(
1910: 62 65 67 69 6e 0a 09 20 20 28 6e 6c 64 62 3a 69  begin..  (nldb:i
1920: 6e 73 65 72 74 2d 6d 6f 64 75 6c 65 20 6e 61 6d  nsert-module nam
1930: 65 2d 69 64 29 0a 09 20 20 28 6e 6c 64 62 3a 67  e-id)..  (nldb:g
1940: 65 74 2d 6d 6f 64 75 6c 65 2d 69 64 20 6e 61 6d  et-module-id nam
1950: 65 2d 69 64 29 29 29 29 29 20 3b 3b 20 6e 6f 77  e-id))))) ;; now
1960: 20 72 65 74 72 69 65 76 65 20 61 6e 64 20 72 65   retrieve and re
1970: 74 75 72 6e 20 74 68 65 20 69 64 0a 0a 3b 3b 20  turn the id..;; 
1980: 6e 6f 74 20 73 61 66 65 20 74 6f 20 75 73 65 20  not safe to use 
1990: 6f 75 74 73 69 64 65 20 6f 66 20 67 65 74 2d 6d  outside of get-m
19a0: 6f 64 75 6c 65 2d 69 64 20 2d 20 63 6f 75 6c 64  odule-id - could
19b0: 20 61 64 64 20 64 75 70 6c 69 63 61 74 65 73 0a   add duplicates.
19c0: 28 64 65 66 69 6e 65 20 28 6e 6c 64 62 3a 69 6e  (define (nldb:in
19d0: 73 65 72 74 2d 6d 6f 64 75 6c 65 20 6e 61 6d 65  sert-module name
19e0: 2d 69 64 29 0a 20 20 28 73 71 6c 69 74 65 33 3a  -id).  (sqlite3:
19f0: 65 78 65 63 20 64 62 20 22 49 4e 53 45 52 54 20  exec db "INSERT 
1a00: 49 4e 54 4f 20 6d 6f 64 75 6c 65 73 20 28 6e 61  INTO modules (na
1a10: 6d 65 5f 69 64 29 20 56 41 4c 55 45 53 20 28 3f  me_id) VALUES (?
1a20: 29 3b 22 20 6e 61 6d 65 2d 69 64 29 29 0a 0a 3b  );" name-id))..;
1a30: 3b 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 73 70 61  ; module namespa
1a40: 63 65 20 69 73 20 75 6e 69 71 75 65 20 73 6f 20  ce is unique so 
1a50: 74 68 69 73 20 69 73 20 6f 6b 2c 20 73 68 6f 75  this is ok, shou
1a60: 6c 64 20 63 68 65 63 6b 20 66 6f 72 20 72 65 64  ld check for red
1a70: 65 66 69 6e 69 6e 67 20 74 68 6f 75 67 68 2e 0a  efining though..
1a80: 28 64 65 66 69 6e 65 20 28 6e 6c 64 62 3a 67 65  (define (nldb:ge
1a90: 74 2d 6d 6f 64 75 6c 65 2d 62 79 2d 6e 61 6d 65  t-module-by-name
1aa0: 20 6e 61 6d 65 29 0a 20 20 28 6c 65 74 20 28 28   name).  (let ((
1ab0: 6d 6f 64 75 6c 65 2d 69 64 20 28 68 61 73 68 2d  module-id (hash-
1ac0: 74 61 62 6c 65 2d 72 65 66 20 2a 6d 6f 64 75 6c  table-ref *modul
1ad0: 65 2d 6e 61 6d 65 2d 63 61 63 68 65 2a 20 6e 61  e-name-cache* na
1ae0: 6d 65 29 29 29 0a 20 20 20 20 28 69 66 20 6d 6f  me))).    (if mo
1af0: 64 75 6c 65 2d 69 64 20 6d 6f 64 75 6c 65 2d 69  dule-id module-i
1b00: 64 0a 09 28 6c 65 74 20 28 28 6d 69 64 20 28 6e  d..(let ((mid (n
1b10: 6c 64 62 3a 67 65 74 2d 6d 6f 64 75 6c 65 2d 69  ldb:get-module-i
1b20: 64 20 28 6e 6c 64 62 3a 67 65 74 2d 6e 61 6d 65  d (nldb:get-name
1b30: 2d 69 64 20 6e 61 6d 65 29 29 29 29 0a 09 20 20  -id name))))..  
1b40: 28 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74 21  (hash-table-set!
1b50: 20 2a 6d 6f 64 75 6c 65 2d 6e 61 6d 65 2d 63 61   *module-name-ca
1b60: 63 68 65 2a 20 6e 61 6d 65 20 6d 69 64 29 29 29  che* name mid)))
1b70: 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ))..;;==========
1b80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1b90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1ba0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1bb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20  ============.;; 
1bc0: 50 49 4e 53 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d  PINS.;;=========
1bd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1be0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1bf0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1c00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28  =============..(
1c10: 64 65 66 69 6e 65 20 28 6e 6c 64 62 3a 67 65 74  define (nldb:get
1c20: 2d 70 69 6e 2d 69 64 20 6d 6f 64 75 6c 65 2d 69  -pin-id module-i
1c30: 64 20 6e 61 6d 65 2d 69 64 29 0a 20 20 28 6e 6c  d name-id).  (nl
1c40: 64 62 3a 73 71 6c 69 74 65 33 3a 67 65 74 2d 6f  db:sqlite3:get-o
1c50: 6e 65 20 0a 20 20 20 28 73 74 72 69 6e 67 2d 61  ne .   (string-a
1c60: 70 70 65 6e 64 20 22 53 45 4c 45 43 54 20 69 64  ppend "SELECT id
1c70: 20 46 52 4f 4d 20 70 69 6e 73 20 57 48 45 52 45   FROM pins WHERE
1c80: 20 6d 6f 64 75 6c 65 5f 69 64 3d 3f 20 41 4e 44   module_id=? AND
1c90: 20 6e 61 6d 65 5f 69 64 3d 3f 3b 22 29 20 0a 20   name_id=?;") . 
1ca0: 20 20 6d 6f 64 75 6c 65 2d 69 64 20 6e 61 6d 65    module-id name
1cb0: 2d 69 64 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  -id))..(define (
1cc0: 6e 6c 64 62 3a 61 64 64 2d 70 69 6e 20 6d 6f 64  nldb:add-pin mod
1cd0: 75 6c 65 2d 69 64 20 6e 61 6d 65 2d 69 64 20 74  ule-id name-id t
1ce0: 79 70 65 2d 69 64 29 0a 20 20 28 6c 65 74 20 28  ype-id).  (let (
1cf0: 28 70 69 6e 2d 69 64 20 28 6e 6c 64 62 3a 67 65  (pin-id (nldb:ge
1d00: 74 2d 70 69 6e 2d 69 64 20 6d 6f 64 75 6c 65 2d  t-pin-id module-
1d10: 69 64 20 6e 61 6d 65 2d 69 64 29 29 29 0a 20 20  id name-id))).  
1d20: 20 20 28 69 66 20 70 69 6e 2d 69 64 20 70 69 6e    (if pin-id pin
1d30: 2d 69 64 0a 09 28 62 65 67 69 6e 09 0a 09 20 20  -id..(begin...  
1d40: 28 6e 6c 64 62 3a 69 6e 73 65 72 74 2d 70 69 6e  (nldb:insert-pin
1d50: 20 6d 6f 64 75 6c 65 2d 69 64 20 6e 61 6d 65 2d   module-id name-
1d60: 69 64 20 74 79 70 65 2d 69 64 29 0a 09 20 20 28  id type-id)..  (
1d70: 6e 6c 64 62 3a 67 65 74 2d 70 69 6e 2d 69 64 20  nldb:get-pin-id 
1d80: 6d 6f 64 75 6c 65 2d 69 64 20 6e 61 6d 65 2d 69  module-id name-i
1d90: 64 29 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20  d)))))..(define 
1da0: 28 6e 6c 64 62 3a 69 6e 73 65 72 74 2d 70 69 6e  (nldb:insert-pin
1db0: 20 6d 6f 64 75 6c 65 2d 69 64 20 6e 61 6d 65 2d   module-id name-
1dc0: 69 64 20 74 79 70 65 2d 69 64 29 0a 20 20 28 73  id type-id).  (s
1dd0: 71 6c 69 74 65 33 3a 65 78 65 63 20 64 62 20 22  qlite3:exec db "
1de0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 69 6e 73  INSERT INTO pins
1df0: 20 28 6d 6f 64 75 6c 65 5f 69 64 2c 6e 61 6d 65   (module_id,name
1e00: 5f 69 64 2c 74 79 70 65 5f 69 64 29 20 56 41 4c  _id,type_id) VAL
1e10: 55 45 53 20 28 3f 2c 3f 2c 3f 29 3b 22 0a 09 09  UES (?,?,?);"...
1e20: 6d 6f 64 75 6c 65 2d 69 64 20 6e 61 6d 65 2d 69  module-id name-i
1e30: 64 20 28 69 66 20 74 79 70 65 2d 69 64 20 74 79  d (if type-id ty
1e40: 70 65 2d 69 64 20 30 29 29 29 0a 0a 28 64 65 66  pe-id 0)))..(def
1e50: 69 6e 65 20 28 6e 6c 64 62 3a 73 65 74 2d 70 69  ine (nldb:set-pi
1e60: 6e 2d 64 69 72 65 63 74 69 6f 6e 20 70 69 6e 2d  n-direction pin-
1e70: 69 64 20 64 69 72 65 63 74 69 6f 6e 29 0a 20 20  id direction).  
1e80: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 20 64 62  (sqlite3:exec db
1e90: 20 22 55 50 44 41 54 45 20 70 69 6e 73 20 53 45   "UPDATE pins SE
1ea0: 54 20 74 79 70 65 5f 69 64 3d 28 53 45 4c 45 43  T type_id=(SELEC
1eb0: 54 20 69 64 20 46 52 4f 4d 20 74 79 70 65 73 20  T id FROM types 
1ec0: 57 48 45 52 45 20 74 79 70 65 3d 3f 29 20 57 48  WHERE type=?) WH
1ed0: 45 52 45 20 69 64 3d 3f 3b 22 20 64 69 72 65 63  ERE id=?;" direc
1ee0: 74 69 6f 6e 20 70 69 6e 2d 69 64 29 29 0a 0a 28  tion pin-id))..(
1ef0: 64 65 66 69 6e 65 20 28 6e 6c 64 62 3a 73 65 74  define (nldb:set
1f00: 2d 70 69 6e 2d 6e 65 74 20 70 69 6e 2d 69 64 20  -pin-net pin-id 
1f10: 6e 65 74 2d 69 64 29 0a 20 20 28 73 71 6c 69 74  net-id).  (sqlit
1f20: 65 33 3a 65 78 65 63 20 64 62 20 22 55 50 44 41  e3:exec db "UPDA
1f30: 54 45 20 70 69 6e 73 20 53 45 54 20 6e 65 74 5f  TE pins SET net_
1f40: 69 64 3d 3f 20 57 48 45 52 45 20 69 64 3d 3f 3b  id=? WHERE id=?;
1f50: 22 20 6e 65 74 2d 69 64 20 70 69 6e 2d 69 64 29  " net-id pin-id)
1f60: 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  )..;;===========
1f70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1f80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1f90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1fa0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 43 4f 4e  =========.;; CON
1fb0: 4e 53 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  NS.;;===========
1fc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1fd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1fe0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1ff0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65  ===========..(de
2000: 66 69 6e 65 20 28 6e 6c 64 62 3a 67 65 74 2d 63  fine (nldb:get-c
2010: 6f 6e 6e 2d 69 64 20 69 6e 73 74 2d 69 64 20 70  onn-id inst-id p
2020: 69 6e 2d 69 64 29 0a 20 20 3b 3b 20 28 69 66 20  in-id).  ;; (if 
2030: 28 6e 6f 74 20 28 61 6e 64 20 69 6e 73 74 2d 69  (not (and inst-i
2040: 64 20 70 69 6e 2d 69 64 29 29 28 70 72 69 6e 74  d pin-id))(print
2050: 20 22 45 52 52 4f 52 3a 20 6e 6c 64 62 3a 67 65   "ERROR: nldb:ge
2060: 74 2d 63 6f 6e 6e 2d 69 64 20 63 61 6c 6c 65 64  t-conn-id called
2070: 20 77 69 74 68 20 62 61 64 20 70 61 72 61 6d 73   with bad params
2080: 3a 20 69 6e 73 74 2d 69 64 20 22 20 69 6e 73 74  : inst-id " inst
2090: 2d 69 64 20 22 20 70 69 6e 2d 69 64 20 22 20 70  -id " pin-id " p
20a0: 69 6e 2d 69 64 29 0a 20 20 28 6e 6c 64 62 3a 73  in-id).  (nldb:s
20b0: 71 6c 69 74 65 33 3a 67 65 74 2d 6f 6e 65 20 20  qlite3:get-one  
20c0: 22 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20  "SELECT id FROM 
20d0: 63 6f 6e 6e 73 20 57 48 45 52 45 20 69 6e 73 74  conns WHERE inst
20e0: 5f 69 64 3d 3f 20 41 4e 44 20 70 69 6e 5f 69 64  _id=? AND pin_id
20f0: 3d 3f 3b 22 20 69 6e 73 74 2d 69 64 20 70 69 6e  =?;" inst-id pin
2100: 2d 69 64 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  -id))..(define (
2110: 6e 6c 64 62 3a 61 64 64 2d 63 6f 6e 6e 20 69 6e  nldb:add-conn in
2120: 73 74 2d 69 64 20 70 69 6e 2d 69 64 20 6e 65 74  st-id pin-id net
2130: 2d 69 64 29 0a 20 20 3b 3b 20 20 28 69 66 20 28  -id).  ;;  (if (
2140: 6e 6f 74 20 28 61 6e 64 20 69 6e 73 74 2d 69 64  not (and inst-id
2150: 20 70 69 6e 2d 69 64 20 6e 65 74 2d 69 64 29 29   pin-id net-id))
2160: 28 70 72 69 6e 74 20 22 45 52 52 4f 52 3a 20 6e  (print "ERROR: n
2170: 6c 64 62 3a 61 64 64 2d 63 6f 6e 6e 20 63 61 6c  ldb:add-conn cal
2180: 6c 65 64 20 77 69 74 68 20 62 61 64 20 70 61 72  led with bad par
2190: 61 6d 73 3a 20 69 6e 73 74 2d 69 64 20 22 20 69  ams: inst-id " i
21a0: 6e 73 74 2d 69 64 20 22 20 70 69 6e 2d 69 64 20  nst-id " pin-id 
21b0: 22 20 70 69 6e 2d 69 64 20 22 20 6e 65 74 2d 69  " pin-id " net-i
21c0: 64 20 22 20 6e 65 74 2d 69 64 29 0a 20 20 28 6c  d " net-id).  (l
21d0: 65 74 20 28 28 63 6f 6e 6e 2d 69 64 20 28 6e 6c  et ((conn-id (nl
21e0: 64 62 3a 67 65 74 2d 63 6f 6e 6e 2d 69 64 20 69  db:get-conn-id i
21f0: 6e 73 74 2d 69 64 20 70 69 6e 2d 69 64 29 29 29  nst-id pin-id)))
2200: 0a 20 20 20 20 28 69 66 20 63 6f 6e 6e 2d 69 64  .    (if conn-id
2210: 20 63 6f 6e 6e 2d 69 64 0a 09 28 62 65 67 69 6e   conn-id..(begin
2220: 09 0a 09 20 20 28 6e 6c 64 62 3a 69 6e 73 65 72  ...  (nldb:inser
2230: 74 2d 63 6f 6e 6e 20 69 6e 73 74 2d 69 64 20 70  t-conn inst-id p
2240: 69 6e 2d 69 64 20 6e 65 74 2d 69 64 29 0a 09 20  in-id net-id).. 
2250: 20 28 6e 6c 64 62 3a 67 65 74 2d 63 6f 6e 6e 2d   (nldb:get-conn-
2260: 69 64 20 69 6e 73 74 2d 69 64 20 70 69 6e 2d 69  id inst-id pin-i
2270: 64 29 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20  d)))))..(define 
2280: 28 6e 6c 64 62 3a 69 6e 73 65 72 74 2d 63 6f 6e  (nldb:insert-con
2290: 6e 20 69 6e 73 74 2d 69 64 20 70 69 6e 2d 69 64  n inst-id pin-id
22a0: 20 6e 65 74 2d 69 64 29 0a 20 20 3b 3b 20 20 28   net-id).  ;;  (
22b0: 69 66 20 28 6e 6f 74 20 28 61 6e 64 20 69 6e 73  if (not (and ins
22c0: 74 2d 69 64 20 70 69 6e 2d 69 64 20 6e 65 74 2d  t-id pin-id net-
22d0: 69 64 29 29 28 70 72 69 6e 74 20 22 45 52 52 4f  id))(print "ERRO
22e0: 52 3a 20 6e 6c 64 62 3a 69 6e 73 65 72 74 2d 63  R: nldb:insert-c
22f0: 6f 6e 6e 20 63 61 6c 6c 65 64 20 77 69 74 68 20  onn called with 
2300: 62 61 64 20 70 61 72 61 6d 73 3a 20 69 6e 73 74  bad params: inst
2310: 2d 69 64 20 22 20 69 6e 73 74 2d 69 64 20 22 20  -id " inst-id " 
2320: 70 69 6e 2d 69 64 20 22 20 70 69 6e 2d 69 64 20  pin-id " pin-id 
2330: 22 20 6e 65 74 2d 69 64 20 22 20 6e 65 74 2d 69  " net-id " net-i
2340: 64 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78  d).  (sqlite3:ex
2350: 65 63 20 64 62 20 22 49 4e 53 45 52 54 20 49 4e  ec db "INSERT IN
2360: 54 4f 20 63 6f 6e 6e 73 20 28 69 6e 73 74 5f 69  TO conns (inst_i
2370: 64 2c 70 69 6e 5f 69 64 2c 6e 65 74 5f 69 64 29  d,pin_id,net_id)
2380: 20 56 41 4c 55 45 53 20 28 3f 2c 3f 2c 3f 29 3b   VALUES (?,?,?);
2390: 22 0a 09 09 69 6e 73 74 2d 69 64 20 70 69 6e 2d  "...inst-id pin-
23a0: 69 64 20 6e 65 74 2d 69 64 20 29 29 0a 0a 3b 3b  id net-id ))..;;
23b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
23c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
23d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
23e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
23f0: 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 4e 45 54 0a 3b 3b  ======.;; NET.;;
2400: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2410: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2420: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2430: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2440: 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65 20  ======..(define 
2450: 28 6e 6c 64 62 3a 67 65 74 2d 6e 65 74 2d 69 64  (nldb:get-net-id
2460: 20 6d 6f 64 75 6c 65 2d 69 64 20 6e 61 6d 65 2d   module-id name-
2470: 69 64 29 0a 20 20 28 6e 6c 64 62 3a 73 71 6c 69  id).  (nldb:sqli
2480: 74 65 33 3a 67 65 74 2d 6f 6e 65 20 22 53 45 4c  te3:get-one "SEL
2490: 45 43 54 20 69 64 20 46 52 4f 4d 20 6e 65 74 73  ECT id FROM nets
24a0: 20 57 48 45 52 45 20 6e 61 6d 65 5f 69 64 3d 3f   WHERE name_id=?
24b0: 3b 22 20 6e 61 6d 65 2d 69 64 29 29 0a 0a 28 64  ;" name-id))..(d
24c0: 65 66 69 6e 65 20 28 6e 6c 64 62 3a 61 64 64 2d  efine (nldb:add-
24d0: 6e 65 74 20 6d 6f 64 75 6c 65 2d 69 64 20 6e 61  net module-id na
24e0: 6d 65 2d 69 64 29 0a 20 20 28 6c 65 74 20 28 28  me-id).  (let ((
24f0: 6e 65 74 2d 69 64 20 28 6e 6c 64 62 3a 67 65 74  net-id (nldb:get
2500: 2d 6e 65 74 2d 69 64 20 6d 6f 64 75 6c 65 2d 69  -net-id module-i
2510: 64 20 6e 61 6d 65 2d 69 64 29 29 29 0a 20 20 20  d name-id))).   
2520: 20 28 69 66 20 6e 65 74 2d 69 64 20 6e 65 74 2d   (if net-id net-
2530: 69 64 0a 09 28 62 65 67 69 6e 0a 09 20 20 28 6e  id..(begin..  (n
2540: 6c 64 62 3a 69 6e 73 65 72 74 2d 6e 65 74 20 6d  ldb:insert-net m
2550: 6f 64 75 6c 65 2d 69 64 20 6e 61 6d 65 2d 69 64  odule-id name-id
2560: 29 0a 09 20 20 28 6e 6c 64 62 3a 67 65 74 2d 6e  )..  (nldb:get-n
2570: 65 74 2d 69 64 20 6d 6f 64 75 6c 65 2d 69 64 20  et-id module-id 
2580: 6e 61 6d 65 2d 69 64 29 29 29 29 29 0a 0a 28 64  name-id)))))..(d
2590: 65 66 69 6e 65 20 28 6e 6c 64 62 3a 69 6e 73 65  efine (nldb:inse
25a0: 72 74 2d 6e 65 74 20 6d 6f 64 75 6c 65 2d 69 64  rt-net module-id
25b0: 20 6e 61 6d 65 2d 69 64 29 0a 20 20 28 73 71 6c   name-id).  (sql
25c0: 69 74 65 33 3a 65 78 65 63 20 64 62 20 22 49 4e  ite3:exec db "IN
25d0: 53 45 52 54 20 49 4e 54 4f 20 6e 65 74 73 20 28  SERT INTO nets (
25e0: 6d 6f 64 75 6c 65 5f 69 64 2c 6e 61 6d 65 5f 69  module_id,name_i
25f0: 64 29 20 56 41 4c 55 45 53 28 3f 2c 3f 29 3b 22  d) VALUES(?,?);"
2600: 20 6d 6f 64 75 6c 65 2d 69 64 20 6e 61 6d 65 2d   module-id name-
2610: 69 64 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d  id))..;;========
2620: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2630: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2640: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2650: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b  ==============.;
2660: 3b 20 49 4e 53 54 41 4e 43 45 53 0a 3b 3b 3d 3d  ; INSTANCES.;;==
2670: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2680: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2690: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
26a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
26b0: 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28 6e  ====..(define (n
26c0: 6c 64 62 3a 67 65 74 2d 69 6e 73 74 2d 69 64 20  ldb:get-inst-id 
26d0: 70 61 72 65 6e 74 2d 69 64 20 6e 61 6d 65 2d 69  parent-id name-i
26e0: 64 29 0a 20 20 28 6e 6c 64 62 3a 73 71 6c 69 74  d).  (nldb:sqlit
26f0: 65 33 3a 67 65 74 2d 6f 6e 65 20 22 53 45 4c 45  e3:get-one "SELE
2700: 43 54 20 69 64 20 46 52 4f 4d 20 69 6e 73 74 73  CT id FROM insts
2710: 20 57 48 45 52 45 20 70 61 72 65 6e 74 5f 69 64   WHERE parent_id
2720: 3d 3f 20 41 4e 44 20 6e 61 6d 65 5f 69 64 3d 3f  =? AND name_id=?
2730: 3b 22 20 70 61 72 65 6e 74 2d 69 64 20 6e 61 6d  ;" parent-id nam
2740: 65 2d 69 64 29 29 0a 0a 3b 3b 20 73 75 62 2d 6d  e-id))..;; sub-m
2750: 6f 64 2d 69 64 20 3d 20 74 79 70 65 20 6f 66 20  od-id = type of 
2760: 69 6e 73 74 61 6e 63 65 2c 20 70 61 72 65 6e 74  instance, parent
2770: 2d 69 64 20 3d 20 77 68 65 72 65 20 69 6e 73 74  -id = where inst
2780: 61 6e 74 69 61 74 65 64 0a 28 64 65 66 69 6e 65  antiated.(define
2790: 20 28 6e 6c 64 62 3a 61 64 64 2d 69 6e 73 74 20   (nldb:add-inst 
27a0: 6d 6f 64 75 6c 65 2d 69 64 20 70 61 72 65 6e 74  module-id parent
27b0: 2d 69 64 20 6e 61 6d 65 2d 69 64 29 0a 20 20 28  -id name-id).  (
27c0: 6c 65 74 20 28 28 69 6e 73 74 2d 69 64 20 28 6e  let ((inst-id (n
27d0: 6c 64 62 3a 67 65 74 2d 69 6e 73 74 2d 69 64 20  ldb:get-inst-id 
27e0: 70 61 72 65 6e 74 2d 69 64 20 6e 61 6d 65 2d 69  parent-id name-i
27f0: 64 29 29 29 20 3b 3b 20 70 61 72 65 6e 74 20 61  d))) ;; parent a
2800: 6e 64 20 6e 61 6d 65 20 61 72 65 20 65 6e 6f 75  nd name are enou
2810: 67 68 20 74 6f 20 69 64 65 6e 74 69 66 79 20 69  gh to identify i
2820: 74 0a 20 20 20 20 28 69 66 20 69 6e 73 74 2d 69  t.    (if inst-i
2830: 64 20 69 6e 73 74 2d 69 64 0a 09 28 62 65 67 69  d inst-id..(begi
2840: 6e 0a 09 20 20 28 6e 6c 64 62 3a 69 6e 73 65 72  n..  (nldb:inser
2850: 74 2d 69 6e 73 74 20 6d 6f 64 75 6c 65 2d 69 64  t-inst module-id
2860: 20 70 61 72 65 6e 74 2d 69 64 20 6e 61 6d 65 2d   parent-id name-
2870: 69 64 29 0a 09 20 20 28 6e 6c 64 62 3a 67 65 74  id)..  (nldb:get
2880: 2d 69 6e 73 74 2d 69 64 20 70 61 72 65 6e 74 2d  -inst-id parent-
2890: 69 64 20 6e 61 6d 65 2d 69 64 29 29 29 29 29 0a  id name-id))))).
28a0: 0a 28 64 65 66 69 6e 65 20 28 6e 6c 64 62 3a 69  .(define (nldb:i
28b0: 6e 73 65 72 74 2d 69 6e 73 74 20 6d 6f 64 75 6c  nsert-inst modul
28c0: 65 2d 69 64 20 70 61 72 65 6e 74 2d 69 64 20 6e  e-id parent-id n
28d0: 61 6d 65 2d 69 64 29 0a 20 20 28 73 71 6c 69 74  ame-id).  (sqlit
28e0: 65 33 3a 65 78 65 63 20 64 62 20 22 49 4e 53 45  e3:exec db "INSE
28f0: 52 54 20 49 4e 54 4f 20 69 6e 73 74 73 20 28 6d  RT INTO insts (m
2900: 6f 64 75 6c 65 5f 69 64 2c 70 61 72 65 6e 74 5f  odule_id,parent_
2910: 69 64 2c 6e 61 6d 65 5f 69 64 29 20 56 41 4c 55  id,name_id) VALU
2920: 45 53 28 3f 2c 3f 2c 3f 29 3b 22 20 6d 6f 64 75  ES(?,?,?);" modu
2930: 6c 65 2d 69 64 20 70 61 72 65 6e 74 2d 69 64 20  le-id parent-id 
2940: 6e 61 6d 65 2d 69 64 29 29 0a 0a 3b 3b 3d 3d 3d  name-id))..;;===
2950: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2960: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2970: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2980: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2990: 3d 3d 3d 0a 3b 3b 20 52 45 43 4f 52 44 20 46 4f  ===.;; RECORD FO
29a0: 52 20 53 54 41 54 45 0a 3b 3b 3d 3d 3d 3d 3d 3d  R STATE.;;======
29b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
29c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
29d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
29e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
29f0: 0a 0a 28 64 65 66 69 6e 65 20 2a 73 74 61 74 65  ..(define *state
2a00: 76 65 63 2a 20 28 6d 61 6b 65 2d 76 65 63 74 6f  vec* (make-vecto
2a10: 72 20 35 29 29 0a 0a 28 64 65 66 69 6e 65 2d 69  r 5))..(define-i
2a20: 6e 6c 69 6e 65 20 28 63 75 72 72 2d 70 69 6e 2d  nline (curr-pin-
2a30: 69 64 29 20 20 20 20 20 20 20 20 20 20 20 28 76  id)           (v
2a40: 65 63 74 6f 72 2d 72 65 66 20 20 2a 73 74 61 74  ector-ref  *stat
2a50: 65 76 65 63 2a 20 30 29 29 0a 28 64 65 66 69 6e  evec* 0)).(defin
2a60: 65 2d 69 6e 6c 69 6e 65 20 28 63 75 72 72 2d 69  e-inline (curr-i
2a70: 6e 73 74 2d 69 64 29 20 20 20 20 20 20 20 20 20  nst-id)         
2a80: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 20 2a 73   (vector-ref  *s
2a90: 74 61 74 65 76 65 63 2a 20 31 29 29 0a 28 64 65  tatevec* 1)).(de
2aa0: 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28 63 75 72  fine-inline (cur
2ab0: 72 2d 6d 6f 64 75 6c 65 2d 69 64 29 20 20 20 20  r-module-id)    
2ac0: 20 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20      (vector-ref 
2ad0: 20 2a 73 74 61 74 65 76 65 63 2a 20 32 29 29 0a   *statevec* 2)).
2ae0: 28 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28  (define-inline (
2af0: 63 75 72 72 2d 69 6e 73 74 2d 6d 6f 64 75 6c 65  curr-inst-module
2b00: 2d 69 64 29 20 20 20 28 76 65 63 74 6f 72 2d 72  -id)   (vector-r
2b10: 65 66 20 20 2a 73 74 61 74 65 76 65 63 2a 20 33  ef  *statevec* 3
2b20: 29 29 0a 0a 28 64 65 66 69 6e 65 2d 69 6e 6c 69  ))..(define-inli
2b30: 6e 65 20 28 73 65 74 2d 63 75 72 72 2d 70 69 6e  ne (set-curr-pin
2b40: 2d 69 64 21 20 20 20 20 20 20 20 20 20 69 64 29  -id!         id)
2b50: 28 76 65 63 74 6f 72 2d 73 65 74 21 20 2a 73 74  (vector-set! *st
2b60: 61 74 65 76 65 63 2a 20 30 20 69 64 29 29 0a 28  atevec* 0 id)).(
2b70: 64 65 66 69 6e 65 2d 69 6e 6c 69 6e 65 20 28 73  define-inline (s
2b80: 65 74 2d 63 75 72 72 2d 69 6e 73 74 2d 69 64 21  et-curr-inst-id!
2b90: 20 20 20 20 20 20 20 20 69 64 29 28 76 65 63 74          id)(vect
2ba0: 6f 72 2d 73 65 74 21 20 2a 73 74 61 74 65 76 65  or-set! *stateve
2bb0: 63 2a 20 31 20 69 64 29 29 0a 28 64 65 66 69 6e  c* 1 id)).(defin
2bc0: 65 2d 69 6e 6c 69 6e 65 20 28 73 65 74 2d 63 75  e-inline (set-cu
2bd0: 72 72 2d 6d 6f 64 75 6c 65 2d 69 64 21 20 20 20  rr-module-id!   
2be0: 20 20 20 69 64 29 28 76 65 63 74 6f 72 2d 73 65     id)(vector-se
2bf0: 74 21 20 2a 73 74 61 74 65 76 65 63 2a 20 32 20  t! *statevec* 2 
2c00: 69 64 29 29 0a 28 64 65 66 69 6e 65 2d 69 6e 6c  id)).(define-inl
2c10: 69 6e 65 20 28 73 65 74 2d 63 75 72 72 2d 69 6e  ine (set-curr-in
2c20: 73 74 2d 6d 6f 64 75 6c 65 2d 69 64 21 20 69 64  st-module-id! id
2c30: 29 28 76 65 63 74 6f 72 2d 73 65 74 21 20 2a 73  )(vector-set! *s
2c40: 74 61 74 65 76 65 63 2a 20 33 20 69 64 29 29 0a  tatevec* 3 id)).
2c50: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .;;=============
2c60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2c70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2c80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2c90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 46 49 4c  =========.;; FIL
2ca0: 45 20 49 2f 4f 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d  E I/O.;;========
2cb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2cc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2cd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2ce0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a  ==============..
2cf0: 3b 3b 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ;; Initializatio
2d00: 6e 20 61 6e 64 20 73 75 70 70 6f 72 74 20 72 6f  n and support ro
2d10: 75 74 69 6e 65 73 20 66 6f 72 20 6e 6c 64 62 3a  utines for nldb:
2d20: 72 65 61 64 2d 66 69 6c 65 0a 28 73 74 61 63 6b  read-file.(stack
2d30: 2d 70 75 73 68 21 20 6e 6c 64 62 3a 2a 73 74 61  -push! nldb:*sta
2d40: 63 6b 2a 20 27 73 74 61 72 74 29 0a 28 64 65 66  ck* 'start).(def
2d50: 69 6e 65 20 6e 6c 64 62 3a 65 73 63 2d 72 65 67  ine nldb:esc-reg
2d60: 65 78 20 20 28 72 65 67 65 78 70 20 22 5e 5c 5c  ex  (regexp "^\\
2d70: 5c 5c 28 5b 5e 5c 5c 73 5d 2a 29 5c 5c 73 2a 24  \\([^\\s]*)\\s*$
2d80: 22 29 20 29 0a 28 64 65 66 69 6e 65 20 28 6e 6c  ") ).(define (nl
2d90: 64 62 3a 63 6c 65 61 6e 2d 69 64 65 6e 74 69 66  db:clean-identif
2da0: 69 65 72 20 74 6f 6b 65 6e 29 0a 20 20 28 6c 65  ier token).  (le
2db0: 74 2a 20 28 28 74 20 20 20 28 63 61 72 20 74 6f  t* ((t   (car to
2dc0: 6b 65 6e 29 29 0a 09 20 28 76 20 20 20 28 63 61  ken)).. (v   (ca
2dd0: 64 72 20 74 6f 6b 65 6e 29 29 0a 09 20 28 63 74  dr token)).. (ct
2de0: 6d 20 28 73 74 72 69 6e 67 2d 6d 61 74 63 68 20  m (string-match 
2df0: 6e 6c 64 62 3a 65 73 63 2d 72 65 67 65 78 20 76  nldb:esc-regex v
2e00: 29 29 29 0a 20 20 20 20 28 6c 69 73 74 20 27 69  ))).    (list 'i
2e10: 64 65 6e 74 69 66 69 65 72 20 28 6c 69 73 74 2d  dentifier (list-
2e20: 72 65 66 20 63 74 6d 20 31 29 29 29 29 0a 0a 0a  ref ctm 1))))...
2e30: 28 64 65 66 69 6e 65 20 28 6e 6c 64 62 3a 72 65  (define (nldb:re
2e40: 61 64 2d 66 69 6c 65 20 66 6e 61 6d 65 29 0a 20  ad-file fname). 
2e50: 20 28 6c 65 74 2a 20 28 28 69 6e 70 20 28 6f 70   (let* ((inp (op
2e60: 65 6e 2d 69 6e 70 75 74 2d 66 69 6c 65 20 66 6e  en-input-file fn
2e70: 61 6d 65 29 29 0a 09 20 28 70 72 65 76 2d 73 74  ame)).. (prev-st
2e80: 61 74 65 20 23 66 29 29 0a 20 20 20 20 28 6c 65  ate #f)).    (le
2e90: 78 65 72 2d 69 6e 69 74 20 27 70 6f 72 74 20 69  xer-init 'port i
2ea0: 6e 70 29 0a 20 20 20 20 28 6c 65 74 20 6c 6f 6f  np).    (let loo
2eb0: 70 20 28 28 74 6f 6b 65 6e 20 20 20 20 20 20 20  p ((token       
2ec0: 20 20 20 28 6c 65 78 65 72 29 29 29 0a 20 20 20     (lexer))).   
2ed0: 20 20 20 28 6c 65 74 20 28 28 74 6f 6b 65 6e 2d     (let ((token-
2ee0: 74 79 70 65 20 28 63 61 72 20 74 6f 6b 65 6e 29  type (car token)
2ef0: 29 0a 09 20 20 20 20 28 74 6f 6b 65 6e 2d 76 61  )..    (token-va
2f00: 6c 20 20 28 63 61 64 72 20 74 6f 6b 65 6e 29 29  l  (cadr token))
2f10: 0a 09 20 20 20 20 28 73 74 61 74 65 20 20 20 20  ..    (state    
2f20: 20 20 28 73 74 61 63 6b 2d 70 65 65 6b 20 68 65    (stack-peek he
2f30: 72 63 3a 2a 73 74 61 63 6b 2a 29 29 29 0a 09 28  rc:*stack*)))..(
2f40: 69 66 20 28 6e 6f 74 20 28 65 71 3f 20 70 72 65  if (not (eq? pre
2f50: 76 2d 73 74 61 74 65 20 73 74 61 74 65 29 29 0a  v-state state)).
2f60: 09 20 20 20 20 28 62 65 67 69 6e 0a 09 20 20 20  .    (begin..   
2f70: 20 20 20 28 70 72 69 6e 74 20 22 73 74 61 74 65     (print "state
2f80: 3a 20 22 20 73 74 61 74 65 29 0a 09 20 20 20 20  : " state)..    
2f90: 20 20 28 73 65 74 21 20 70 72 65 76 2d 73 74 61    (set! prev-sta
2fa0: 74 65 20 73 74 61 74 65 29 29 29 0a 09 28 63 61  te state)))..(ca
2fb0: 73 65 20 74 6f 6b 65 6e 2d 74 79 70 65 0a 09 20  se token-type.. 
2fc0: 20 28 27 65 6e 64 2d 6f 66 2d 69 6e 70 75 74 20   ('end-of-input 
2fd0: 20 20 20 20 20 20 28 70 72 69 6e 74 20 22 44 6f        (print "Do
2fe0: 6e 65 22 29 28 63 6c 6f 73 65 2d 69 6e 70 75 74  ne")(close-input
2ff0: 2d 70 6f 72 74 20 69 6e 70 29 29 0a 09 20 20 28  -port inp))..  (
3000: 27 77 68 69 74 65 73 70 61 63 65 20 20 20 20 20  'whitespace     
3010: 20 20 20 20 28 6c 6f 6f 70 20 28 6c 65 78 65 72      (loop (lexer
3020: 29 29 29 20 20 3b 3b 20 73 6b 69 70 20 77 68 69  )))  ;; skip whi
3030: 74 65 73 70 61 63 65 0a 09 20 20 28 27 63 6f 6d  tespace..  ('com
3040: 6d 65 6e 74 2d 62 65 67 69 6e 20 20 20 20 20 20  ment-begin      
3050: 0a 09 20 20 20 28 73 74 61 63 6b 2d 70 75 73 68  ..   (stack-push
3060: 21 20 68 65 72 63 3a 2a 73 74 61 63 6b 2a 20 27  ! herc:*stack* '
3070: 63 6f 6d 6d 65 6e 74 20 29 0a 09 20 20 20 28 6c  comment )..   (l
3080: 6f 6f 70 20 28 6c 65 78 65 72 29 29 29 0a 09 20  oop (lexer))).. 
3090: 20 28 27 63 6f 6d 6d 65 6e 74 2d 65 6e 64 20 20   ('comment-end  
30a0: 20 20 20 20 20 20 28 73 74 61 63 6b 2d 70 6f 70        (stack-pop
30b0: 21 20 68 65 72 63 3a 2a 73 74 61 63 6b 2a 29 28  ! herc:*stack*)(
30c0: 6c 6f 6f 70 20 28 6c 65 78 65 72 29 29 29 0a 09  loop (lexer)))..
30d0: 20 20 28 27 62 65 67 69 6e 20 20 20 20 20 20 20    ('begin       
30e0: 20 20 20 20 20 20 20 28 73 74 61 63 6b 2d 70 75         (stack-pu
30f0: 73 68 21 20 68 65 72 63 3a 2a 73 74 61 63 6b 2a  sh! herc:*stack*
3100: 20 27 62 65 67 69 6e 29 28 6c 6f 6f 70 20 28 6c   'begin)(loop (l
3110: 65 78 65 72 29 29 29 0a 09 20 20 28 27 65 6e 64  exer)))..  ('end
3120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3130: 28 73 74 61 63 6b 2d 70 6f 70 21 20 68 65 72 63  (stack-pop! herc
3140: 3a 2a 73 74 61 63 6b 2a 29 28 6c 6f 6f 70 20 28  :*stack*)(loop (
3150: 6c 65 78 65 72 29 29 29 0a 09 20 20 28 27 63 65  lexer)))..  ('ce
3160: 6c 6c 0a 09 20 20 20 28 63 61 73 65 20 73 74 61  ll..   (case sta
3170: 74 65 0a 09 20 20 20 20 20 28 27 62 65 67 69 6e  te..     ('begin
3180: 0a 09 20 20 20 20 20 20 20 28 73 74 61 63 6b 2d  ..       (stack-
3190: 70 75 73 68 21 20 68 65 72 63 3a 2a 73 74 61 63  push! herc:*stac
31a0: 6b 2a 20 27 63 65 6c 6c 2d 6e 61 6d 65 29 0a 09  k* 'cell-name)..
31b0: 20 20 20 20 20 20 20 28 6c 6f 6f 70 20 28 6c 65         (loop (le
31c0: 78 65 72 29 29 29 0a 09 20 20 20 20 20 28 65 6c  xer)))..     (el
31d0: 73 65 0a 09 20 20 20 20 20 20 28 6c 6f 6f 70 20  se..      (loop 
31e0: 28 6c 65 78 65 72 29 29 29 29 29 0a 09 20 20 28  (lexer)))))..  (
31f0: 27 70 6c 61 69 6e 69 64 65 6e 74 69 66 69 65 72  'plainidentifier
3200: 0a 09 20 20 20 28 63 61 73 65 20 73 74 61 74 65  ..   (case state
3210: 0a 09 20 20 20 20 20 28 27 63 65 6c 6c 2d 6e 61  ..     ('cell-na
3220: 6d 65 0a 0a 09 20 20 28 27 73 74 61 74 65 6d 65  me...  ('stateme
3230: 6e 74 65 6e 64 20 20 20 20 20 20 20 28 73 74 61  ntend       (sta
3240: 63 6b 2d 70 6f 70 21 20 6e 6c 64 62 3a 2a 73 74  ck-pop! nldb:*st
3250: 61 63 6b 2a 29 28 6c 6f 6f 70 20 28 6c 65 78 65  ack*)(loop (lexe
3260: 72 29 29 29 0a 09 20 20 28 27 65 6e 64 70 61 72  r)))..  ('endpar
3270: 65 6e 20 20 20 20 20 20 20 20 20 20 20 28 73 74  en           (st
3280: 61 63 6b 2d 70 6f 70 21 20 6e 6c 64 62 3a 2a 73  ack-pop! nldb:*s
3290: 74 61 63 6b 2a 29 28 6c 6f 6f 70 20 28 6c 65 78  tack*)(loop (lex
32a0: 65 72 29 29 29 0a 09 20 20 28 27 65 6e 64 6d 6f  er)))..  ('endmo
32b0: 64 75 6c 65 20 20 20 20 20 20 20 20 20 20 28 73  dule          (s
32c0: 74 61 63 6b 2d 70 6f 70 21 20 6e 6c 64 62 3a 2a  tack-pop! nldb:*
32d0: 73 74 61 63 6b 2a 29 28 6c 6f 6f 70 20 28 6c 65  stack*)(loop (le
32e0: 78 65 72 29 29 29 0a 0a 09 20 20 28 27 73 74 61  xer)))...  ('sta
32f0: 72 74 70 61 72 65 6e 20 0a 09 20 20 20 28 63 61  rtparen ..   (ca
3300: 73 65 20 73 74 61 74 65 0a 09 20 20 20 20 20 28  se state..     (
3310: 27 6d 6f 64 75 6c 65 2d 70 69 6e 73 20 20 20 20  'module-pins    
3320: 20 28 6c 6f 6f 70 20 28 6c 65 78 65 72 29 29 29   (loop (lexer)))
3330: 0a 09 20 20 20 20 20 28 27 69 6e 73 74 2d 64 65  ..     ('inst-de
3340: 66 20 20 20 20 20 20 20 20 28 6c 6f 6f 70 20 28  f        (loop (
3350: 6c 65 78 65 72 29 29 29 0a 09 20 20 20 20 20 28  lexer)))..     (
3360: 27 69 6e 73 74 2d 63 6f 6e 6e 2d 64 65 66 20 20  'inst-conn-def  
3370: 20 28 6c 6f 6f 70 20 28 6c 65 78 65 72 29 29 29   (loop (lexer)))
3380: 0a 09 20 20 20 20 20 28 27 70 69 6e 2d 6e 65 74  ..     ('pin-net
3390: 20 20 20 20 20 20 20 20 20 28 6c 6f 6f 70 20 28           (loop (
33a0: 6c 65 78 65 72 29 29 29 0a 09 20 20 20 20 20 28  lexer)))..     (
33b0: 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20  else            
33c0: 20 28 70 72 69 6e 74 20 22 45 52 52 4f 52 3a 20   (print "ERROR: 
33d0: 44 69 64 6e 27 74 20 65 78 70 65 63 74 20 61 6e  Didn't expect an
33e0: 20 6f 70 65 6e 20 70 61 72 65 6e 20 68 65 72 65   open paren here
33f0: 21 20 4c 69 6e 65 20 22 20 28 6c 65 78 65 72 2d  ! Line " (lexer-
3400: 67 65 74 2d 6c 69 6e 65 29 29 29 29 29 0a 0a 09  get-line)))))...
3410: 20 20 28 27 63 6f 6d 6d 61 0a 09 20 20 20 28 63    ('comma..   (c
3420: 61 73 65 20 73 74 61 74 65 0a 09 20 20 20 20 20  ase state..     
3430: 28 27 6d 6f 64 75 6c 65 2d 70 69 6e 73 20 20 20  ('module-pins   
3440: 20 20 28 6c 6f 6f 70 20 28 6c 65 78 65 72 29 29    (loop (lexer))
3450: 29 0a 09 20 20 20 20 20 28 27 69 6e 70 75 74 2d  )..     ('input-
3460: 70 69 6e 20 20 20 20 20 20 20 28 6c 6f 6f 70 20  pin       (loop 
3470: 28 6c 65 78 65 72 29 29 29 0a 09 20 20 20 20 20  (lexer)))..     
3480: 28 27 6f 75 74 70 75 74 2d 70 69 6e 20 20 20 20  ('output-pin    
3490: 20 20 28 6c 6f 6f 70 20 28 6c 65 78 65 72 29 29    (loop (lexer))
34a0: 29 0a 09 20 20 20 20 20 28 27 77 69 72 65 20 20  )..     ('wire  
34b0: 20 20 20 20 20 20 20 20 20 20 28 6c 6f 6f 70 20            (loop 
34c0: 28 6c 65 78 65 72 29 29 29 0a 09 20 20 20 20 20  (lexer)))..     
34d0: 28 27 69 6e 73 74 2d 63 6f 6e 6e 2d 64 65 66 20  ('inst-conn-def 
34e0: 20 20 28 6c 6f 6f 70 20 28 6c 65 78 65 72 29 29    (loop (lexer))
34f0: 29 20 3b 3b 20 28 73 74 61 63 6b 2d 70 6f 70 21  ) ;; (stack-pop!
3500: 20 6e 6c 64 62 3a 2a 73 74 61 63 6b 2a 29 20 28   nldb:*stack*) (
3510: 6c 6f 6f 70 20 28 6c 65 78 65 72 29 29 29 0a 09  loop (lexer)))..
3520: 20 20 20 20 20 28 65 6c 73 65 20 20 20 20 20 20       (else      
3530: 20 20 20 20 20 20 20 28 70 72 69 6e 74 20 22 45         (print "E
3540: 52 52 4f 52 3a 20 44 69 64 6e 27 74 20 65 78 70  RROR: Didn't exp
3550: 65 63 74 20 61 20 63 6f 6d 6d 61 20 68 65 72 65  ect a comma here
3560: 21 20 4c 69 6e 65 20 22 20 28 6c 65 78 65 72 2d  ! Line " (lexer-
3570: 67 65 74 2d 6c 69 6e 65 29 29 29 29 29 0a 0a 09  get-line)))))...
3580: 20 20 28 27 6d 6f 64 75 6c 65 20 0a 09 20 20 20    ('module ..   
3590: 28 63 61 73 65 20 73 74 61 74 65 0a 09 20 20 20  (case state..   
35a0: 20 20 28 27 73 74 61 72 74 20 0a 09 20 20 20 20    ('start ..    
35b0: 20 20 28 73 74 61 63 6b 2d 70 75 73 68 21 20 6e    (stack-push! n
35c0: 6c 64 62 3a 2a 73 74 61 63 6b 2a 20 27 6d 6f 64  ldb:*stack* 'mod
35d0: 75 6c 65 29 20 20 20 20 20 20 3b 3b 20 77 65 20  ule)      ;; we 
35e0: 77 69 6c 6c 20 62 65 20 69 6e 20 61 20 6d 6f 64  will be in a mod
35f0: 75 6c 65 0a 09 20 20 20 20 20 20 28 73 74 61 63  ule..      (stac
3600: 6b 2d 70 75 73 68 21 20 6e 6c 64 62 3a 2a 73 74  k-push! nldb:*st
3610: 61 63 6b 2a 20 27 6d 6f 64 75 6c 65 2d 64 65 66  ack* 'module-def
3620: 29 29 20 3b 3b 20 73 74 61 72 74 69 6e 67 20 69  )) ;; starting i
3630: 6e 20 74 68 65 20 64 65 66 0a 09 20 20 20 20 20  n the def..     
3640: 28 65 6c 73 65 0a 09 20 20 20 20 20 20 28 70 72  (else..      (pr
3650: 69 6e 74 20 22 45 52 52 4f 52 3a 20 44 69 64 6e  int "ERROR: Didn
3660: 27 74 20 65 78 70 65 63 74 20 6d 6f 64 75 6c 65  't expect module
3670: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 68 65 72   declaration her
3680: 65 21 20 4c 69 6e 65 20 22 20 28 6c 65 78 65 72  e! Line " (lexer
3690: 2d 67 65 74 2d 6c 69 6e 65 29 29 29 29 0a 09 20  -get-line)))).. 
36a0: 20 20 28 6c 6f 6f 70 20 28 6c 65 78 65 72 29 29    (loop (lexer))
36b0: 29 0a 0a 09 20 20 28 27 69 6e 70 75 74 20 0a 09  )...  ('input ..
36c0: 20 20 20 28 63 61 73 65 20 73 74 61 74 65 0a 09     (case state..
36d0: 20 20 20 20 20 28 27 6d 6f 64 75 6c 65 20 20 20       ('module   
36e0: 20 20 20 28 73 74 61 63 6b 2d 70 75 73 68 21 20     (stack-push! 
36f0: 6e 6c 64 62 3a 2a 73 74 61 63 6b 2a 20 27 69 6e  nldb:*stack* 'in
3700: 70 75 74 2d 70 69 6e 29 29 0a 09 20 20 20 20 20  put-pin))..     
3710: 28 65 6c 73 65 20 20 20 20 20 20 20 20 20 28 70  (else         (p
3720: 72 69 6e 74 20 22 45 52 52 4f 52 3a 20 44 69 64  rint "ERROR: Did
3730: 6e 27 74 20 65 78 70 65 63 74 20 5c 22 69 6e 70  n't expect \"inp
3740: 75 74 5c 22 20 73 74 61 74 65 6d 65 6e 74 20 68  ut\" statement h
3750: 65 72 65 21 20 4c 69 6e 65 6e 75 6d 20 22 20 28  ere! Linenum " (
3760: 6c 65 78 65 72 2d 67 65 74 2d 6c 69 6e 65 29 29  lexer-get-line))
3770: 29 29 0a 09 20 20 20 28 6c 6f 6f 70 20 28 6c 65  ))..   (loop (le
3780: 78 65 72 29 29 29 0a 0a 09 20 20 28 27 6f 75 74  xer)))...  ('out
3790: 70 75 74 0a 09 20 20 20 28 63 61 73 65 20 73 74  put..   (case st
37a0: 61 74 65 0a 09 20 20 20 20 20 28 27 6d 6f 64 75  ate..     ('modu
37b0: 6c 65 20 20 20 20 20 20 28 73 74 61 63 6b 2d 70  le      (stack-p
37c0: 75 73 68 21 20 6e 6c 64 62 3a 2a 73 74 61 63 6b  ush! nldb:*stack
37d0: 2a 20 27 6f 75 74 70 75 74 2d 70 69 6e 29 29 0a  * 'output-pin)).
37e0: 09 20 20 20 20 20 28 65 6c 73 65 20 20 20 20 20  .     (else     
37f0: 20 20 20 20 28 70 72 69 6e 74 20 22 45 52 52 4f      (print "ERRO
3800: 52 3a 20 44 69 64 6e 27 74 20 65 78 70 65 63 74  R: Didn't expect
3810: 20 5c 22 6f 75 74 70 75 74 5c 22 20 73 74 61 74   \"output\" stat
3820: 65 6d 65 6e 74 20 68 65 72 65 21 20 4c 69 6e 65  ement here! Line
3830: 6e 75 6d 20 22 20 28 6c 65 78 65 72 2d 67 65 74  num " (lexer-get
3840: 2d 6c 69 6e 65 29 29 29 29 0a 09 20 20 20 28 6c  -line))))..   (l
3850: 6f 6f 70 20 28 6c 65 78 65 72 29 29 29 0a 09 20  oop (lexer))).. 
3860: 20 0a 09 20 20 28 27 69 6e 6f 75 74 0a 09 20 20   ..  ('inout..  
3870: 20 28 63 61 73 65 20 73 74 61 74 65 0a 09 20 20   (case state..  
3880: 20 20 20 28 27 6d 6f 64 75 6c 65 20 20 20 20 20     ('module     
3890: 20 28 73 74 61 63 6b 2d 70 75 73 68 21 20 6e 6c   (stack-push! nl
38a0: 64 62 3a 2a 73 74 61 63 6b 2a 20 27 69 6e 6f 75  db:*stack* 'inou
38b0: 74 2d 70 69 6e 29 29 0a 09 20 20 20 20 20 28 65  t-pin))..     (e
38c0: 6c 73 65 20 20 20 20 20 20 20 20 20 28 70 72 69  lse         (pri
38d0: 6e 74 20 22 45 52 52 4f 52 3a 20 44 69 64 6e 27  nt "ERROR: Didn'
38e0: 74 20 65 78 70 65 63 74 20 5c 22 69 6e 6f 75 74  t expect \"inout
38f0: 5c 22 20 73 74 61 74 65 6d 65 6e 74 20 68 65 72  \" statement her
3900: 65 21 20 4c 69 6e 65 6e 75 6d 20 22 20 28 6c 65  e! Linenum " (le
3910: 78 65 72 2d 67 65 74 2d 6c 69 6e 65 29 29 29 29  xer-get-line))))
3920: 0a 09 20 20 20 28 6c 6f 6f 70 20 28 6c 65 78 65  ..   (loop (lexe
3930: 72 29 29 29 0a 0a 09 20 20 28 27 70 69 6e 20 0a  r)))...  ('pin .
3940: 09 20 20 20 28 63 61 73 65 20 73 74 61 74 65 0a  .   (case state.
3950: 09 20 20 20 20 20 28 27 69 6e 73 74 2d 63 6f 6e  .     ('inst-con
3960: 6e 2d 64 65 66 0a 09 20 20 20 20 20 20 28 6c 65  n-def..      (le
3970: 74 2a 20 28 28 70 69 6e 2d 6e 61 6d 65 20 20 20  t* ((pin-name   
3980: 20 28 73 75 62 73 74 72 69 6e 67 20 74 6f 6b 65   (substring toke
3990: 6e 2d 76 61 6c 20 31 20 28 73 74 72 69 6e 67 2d  n-val 1 (string-
39a0: 6c 65 6e 67 74 68 20 74 6f 6b 65 6e 2d 76 61 6c  length token-val
39b0: 29 29 29 0a 09 09 20 20 20 20 20 28 70 69 6e 2d  )))...     (pin-
39c0: 6e 61 6d 65 2d 69 64 20 28 6e 6c 64 62 3a 67 65  name-id (nldb:ge
39d0: 74 2d 6e 61 6d 65 2d 69 64 20 70 69 6e 2d 6e 61  t-name-id pin-na
39e0: 6d 65 29 29 0a 09 09 20 20 20 20 20 28 70 69 6e  me))...     (pin
39f0: 2d 69 64 20 20 20 20 20 20 28 6e 6c 64 62 3a 61  -id      (nldb:a
3a00: 64 64 2d 70 69 6e 20 28 63 75 72 72 2d 6d 6f 64  dd-pin (curr-mod
3a10: 75 6c 65 2d 69 64 29 20 70 69 6e 2d 6e 61 6d 65  ule-id) pin-name
3a20: 2d 69 64 20 23 66 29 29 29 0a 09 09 28 73 74 61  -id #f)))...(sta
3a30: 63 6b 2d 70 75 73 68 21 20 6e 6c 64 62 3a 2a 73  ck-push! nldb:*s
3a40: 74 61 63 6b 2a 20 27 70 69 6e 2d 6e 65 74 29 0a  tack* 'pin-net).
3a50: 09 09 28 73 65 74 2d 63 75 72 72 2d 70 69 6e 2d  ..(set-curr-pin-
3a60: 69 64 21 20 70 69 6e 2d 69 64 29 0a 09 09 28 6c  id! pin-id)...(l
3a70: 6f 6f 70 20 28 6c 65 78 65 72 29 29 29 29 0a 09  oop (lexer))))..
3a80: 20 20 20 20 20 28 65 6c 73 65 20 20 28 70 72 69       (else  (pri
3a90: 6e 74 20 22 45 52 52 4f 52 3a 20 44 69 64 6e 27  nt "ERROR: Didn'
3aa0: 74 20 65 78 70 65 63 74 20 70 69 6e 20 68 65 72  t expect pin her
3ab0: 65 20 22 20 74 6f 6b 65 6e 2d 76 61 6c 20 22 20  e " token-val " 
3ac0: 4c 69 6e 65 6e 75 6d 3a 20 22 20 28 6c 65 78 65  Linenum: " (lexe
3ad0: 72 2d 67 65 74 2d 6c 69 6e 65 29 29 29 29 29 0a  r-get-line))))).
3ae0: 0a 09 20 20 28 27 69 64 65 6e 74 69 66 69 65 72  ..  ('identifier
3af0: 0a 09 20 20 20 28 63 61 73 65 20 73 74 61 74 65  ..   (case state
3b00: 0a 09 20 20 20 20 20 28 27 6d 6f 64 75 6c 65 20  ..     ('module 
3b10: 20 3b 3b 20 74 68 69 73 20 6d 75 73 74 20 62 65   ;; this must be
3b20: 20 61 6e 20 69 6e 73 74 61 6e 63 65 2c 20 61 6e   an instance, an
3b30: 20 69 64 65 6e 74 69 66 69 65 72 20 61 74 20 74   identifier at t
3b40: 68 65 20 74 6f 70 20 6c 65 76 65 6c 0a 09 20 20  he top level..  
3b50: 20 20 20 20 28 6c 65 74 2a 20 28 28 69 6e 73 74      (let* ((inst
3b60: 2d 6d 6f 64 2d 69 64 20 28 6e 6c 64 62 3a 67 65  -mod-id (nldb:ge
3b70: 74 2d 6d 6f 64 75 6c 65 2d 62 79 2d 6e 61 6d 65  t-module-by-name
3b80: 20 74 6f 6b 65 6e 2d 76 61 6c 29 29 29 0a 09 09   token-val)))...
3b90: 28 73 65 74 2d 63 75 72 72 2d 69 6e 73 74 2d 6d  (set-curr-inst-m
3ba0: 6f 64 75 6c 65 2d 69 64 21 20 69 6e 73 74 2d 6d  odule-id! inst-m
3bb0: 6f 64 2d 69 64 29 0a 09 09 28 73 74 61 63 6b 2d  od-id)...(stack-
3bc0: 70 75 73 68 21 20 6e 6c 64 62 3a 2a 73 74 61 63  push! nldb:*stac
3bd0: 6b 2a 20 27 69 6e 73 74 2d 64 65 66 29 29 0a 09  k* 'inst-def))..
3be0: 20 20 20 20 20 20 28 6c 6f 6f 70 20 28 6c 65 78        (loop (lex
3bf0: 65 72 29 29 29 0a 09 20 20 20 20 20 28 27 69 6e  er)))..     ('in
3c00: 73 74 2d 64 65 66 20 20 20 20 20 20 20 20 20 20  st-def          
3c10: 20 20 20 20 20 20 20 20 3b 3b 20 20 20 20 20 69          ;;     i
3c20: 6e 73 74 2d 6d 6f 64 75 6c 65 20 74 79 70 65 20  nst-module type 
3c30: 20 70 61 72 65 6e 74 2d 69 64 20 20 20 20 69 6e   parent-id    in
3c40: 73 74 2d 6e 61 6d 65 2d 69 64 0a 09 20 20 20 20  st-name-id..    
3c50: 20 20 28 6c 65 74 2a 20 28 28 69 6e 73 74 2d 69    (let* ((inst-i
3c60: 64 20 28 6e 6c 64 62 3a 61 64 64 2d 69 6e 73 74  d (nldb:add-inst
3c70: 20 28 63 75 72 72 2d 69 6e 73 74 2d 6d 6f 64 75   (curr-inst-modu
3c80: 6c 65 2d 69 64 29 28 63 75 72 72 2d 6d 6f 64 75  le-id)(curr-modu
3c90: 6c 65 2d 69 64 29 28 6e 6c 64 62 3a 67 65 74 2d  le-id)(nldb:get-
3ca0: 6e 61 6d 65 2d 69 64 20 74 6f 6b 65 6e 2d 76 61  name-id token-va
3cb0: 6c 29 29 29 29 0a 09 09 28 73 65 74 2d 63 75 72  l))))...(set-cur
3cc0: 72 2d 69 6e 73 74 2d 69 64 21 20 69 6e 73 74 2d  r-inst-id! inst-
3cd0: 69 64 29 29 0a 09 20 20 20 20 20 20 28 73 74 61  id))..      (sta
3ce0: 63 6b 2d 70 75 73 68 21 20 6e 6c 64 62 3a 2a 73  ck-push! nldb:*s
3cf0: 74 61 63 6b 2a 20 27 69 6e 73 74 2d 63 6f 6e 6e  tack* 'inst-conn
3d00: 2d 64 65 66 29 0a 09 20 20 20 20 20 20 28 6c 6f  -def)..      (lo
3d10: 6f 70 20 28 6c 65 78 65 72 29 29 29 0a 09 20 20  op (lexer)))..  
3d20: 20 20 20 28 27 6d 6f 64 75 6c 65 2d 64 65 66 0a     ('module-def.
3d30: 09 20 20 20 20 20 20 28 6c 65 74 2a 20 28 28 6d  .      (let* ((m
3d40: 2d 69 64 20 28 6e 6c 64 62 3a 67 65 74 2d 6d 6f  -id (nldb:get-mo
3d50: 64 75 6c 65 2d 62 79 2d 6e 61 6d 65 20 74 6f 6b  dule-by-name tok
3d60: 65 6e 2d 76 61 6c 29 29 29 0a 09 09 28 73 65 74  en-val)))...(set
3d70: 2d 63 75 72 72 2d 6d 6f 64 75 6c 65 2d 69 64 21  -curr-module-id!
3d80: 20 6d 2d 69 64 29 29 0a 09 20 20 20 20 20 20 28   m-id))..      (
3d90: 73 74 61 63 6b 2d 70 75 73 68 21 20 6e 6c 64 62  stack-push! nldb
3da0: 3a 2a 73 74 61 63 6b 2a 20 27 6d 6f 64 75 6c 65  :*stack* 'module
3db0: 2d 70 69 6e 73 29 29 0a 09 20 20 20 20 20 28 27  -pins))..     ('
3dc0: 6d 6f 64 75 6c 65 2d 70 69 6e 73 0a 09 20 20 20  module-pins..   
3dd0: 20 20 20 28 6e 6c 64 62 3a 61 64 64 2d 70 69 6e     (nldb:add-pin
3de0: 20 28 63 75 72 72 2d 6d 6f 64 75 6c 65 2d 69 64   (curr-module-id
3df0: 29 20 28 6e 6c 64 62 3a 67 65 74 2d 6e 61 6d 65  ) (nldb:get-name
3e00: 2d 69 64 20 74 6f 6b 65 6e 2d 76 61 6c 29 20 23  -id token-val) #
3e10: 66 29 29 0a 09 20 20 20 20 20 28 27 69 6e 70 75  f))..     ('inpu
3e20: 74 2d 70 69 6e 0a 09 20 20 20 20 20 20 28 6c 65  t-pin..      (le
3e30: 74 20 28 28 70 69 6e 2d 69 64 20 28 6e 6c 64 62  t ((pin-id (nldb
3e40: 3a 67 65 74 2d 70 69 6e 2d 69 64 20 28 63 75 72  :get-pin-id (cur
3e50: 72 2d 6d 6f 64 75 6c 65 2d 69 64 29 20 28 6e 6c  r-module-id) (nl
3e60: 64 62 3a 67 65 74 2d 6e 61 6d 65 2d 69 64 20 74  db:get-name-id t
3e70: 6f 6b 65 6e 2d 76 61 6c 29 29 29 29 0a 09 09 28  oken-val))))...(
3e80: 6e 6c 64 62 3a 73 65 74 2d 70 69 6e 2d 64 69 72  nldb:set-pin-dir
3e90: 65 63 74 69 6f 6e 20 70 69 6e 2d 69 64 20 22 69  ection pin-id "i
3ea0: 6e 70 75 74 22 29 29 29 0a 09 20 20 20 20 20 28  nput")))..     (
3eb0: 27 6f 75 74 70 75 74 2d 70 69 6e 0a 09 20 20 20  'output-pin..   
3ec0: 20 20 20 28 6c 65 74 20 28 28 70 69 6e 2d 69 64     (let ((pin-id
3ed0: 20 28 6e 6c 64 62 3a 67 65 74 2d 70 69 6e 2d 69   (nldb:get-pin-i
3ee0: 64 20 28 63 75 72 72 2d 6d 6f 64 75 6c 65 2d 69  d (curr-module-i
3ef0: 64 29 20 28 6e 6c 64 62 3a 67 65 74 2d 6e 61 6d  d) (nldb:get-nam
3f00: 65 2d 69 64 20 74 6f 6b 65 6e 2d 76 61 6c 29 29  e-id token-val))
3f10: 29 29 0a 09 09 28 6e 6c 64 62 3a 73 65 74 2d 70  ))...(nldb:set-p
3f20: 69 6e 2d 64 69 72 65 63 74 69 6f 6e 20 70 69 6e  in-direction pin
3f30: 2d 69 64 20 22 6f 75 74 70 75 74 22 29 29 29 0a  -id "output"))).
3f40: 09 20 20 20 20 20 28 27 69 6e 6f 75 74 2d 70 69  .     ('inout-pi
3f50: 6e 0a 09 20 20 20 20 20 20 28 6c 65 74 20 28 28  n..      (let ((
3f60: 70 69 6e 2d 69 64 20 28 6e 6c 64 62 3a 67 65 74  pin-id (nldb:get
3f70: 2d 70 69 6e 2d 69 64 20 28 63 75 72 72 2d 6d 6f  -pin-id (curr-mo
3f80: 64 75 6c 65 2d 69 64 29 20 28 6e 6c 64 62 3a 67  dule-id) (nldb:g
3f90: 65 74 2d 6e 61 6d 65 2d 69 64 20 74 6f 6b 65 6e  et-name-id token
3fa0: 2d 76 61 6c 29 29 29 29 0a 09 09 28 6e 6c 64 62  -val))))...(nldb
3fb0: 3a 73 65 74 2d 70 69 6e 2d 64 69 72 65 63 74 69  :set-pin-directi
3fc0: 6f 6e 20 70 69 6e 2d 69 64 20 22 69 6e 6f 75 74  on pin-id "inout
3fd0: 22 29 29 29 0a 09 20 20 20 20 20 28 27 70 69 6e  ")))..     ('pin
3fe0: 2d 6e 65 74 0a 09 20 20 20 20 20 20 28 6c 65 74  -net..      (let
3ff0: 2a 20 28 28 6e 65 74 2d 6e 61 6d 65 2d 69 64 20  * ((net-name-id 
4000: 28 6e 6c 64 62 3a 67 65 74 2d 6e 61 6d 65 2d 69  (nldb:get-name-i
4010: 64 20 74 6f 6b 65 6e 2d 76 61 6c 29 29 0a 09 09  d token-val))...
4020: 20 20 20 20 20 28 6e 65 74 2d 69 64 20 20 20 20       (net-id    
4030: 20 20 28 6e 6c 64 62 3a 61 64 64 2d 6e 65 74 20    (nldb:add-net 
4040: 28 63 75 72 72 2d 69 6e 73 74 2d 6d 6f 64 75 6c  (curr-inst-modul
4050: 65 2d 69 64 29 20 6e 65 74 2d 6e 61 6d 65 2d 69  e-id) net-name-i
4060: 64 29 29 29 0a 09 09 28 6e 6c 64 62 3a 61 64 64  d)))...(nldb:add
4070: 2d 63 6f 6e 6e 20 28 63 75 72 72 2d 69 6e 73 74  -conn (curr-inst
4080: 2d 69 64 29 20 28 63 75 72 72 2d 70 69 6e 2d 69  -id) (curr-pin-i
4090: 64 29 20 6e 65 74 2d 69 64 29 29 29 0a 09 20 20  d) net-id)))..  
40a0: 20 20 20 28 65 6c 73 65 0a 09 20 20 20 20 20 20     (else..      
40b0: 28 70 72 69 6e 74 20 22 45 52 52 4f 52 3a 20 44  (print "ERROR: D
40c0: 69 64 6e 27 74 20 65 78 70 65 63 74 20 61 6e 20  idn't expect an 
40d0: 69 64 65 6e 74 69 66 69 65 72 20 68 65 72 65 21  identifier here!
40e0: 20 54 6f 6b 65 6e 20 22 20 74 6f 6b 65 6e 2d 76   Token " token-v
40f0: 61 6c 20 22 20 4c 69 6e 65 20 22 20 28 6c 65 78  al " Line " (lex
4100: 65 72 2d 67 65 74 2d 6c 69 6e 65 29 29 29 29 0a  er-get-line)))).
4110: 09 20 20 20 28 6c 6f 6f 70 20 28 6c 65 78 65 72  .   (loop (lexer
4120: 29 29 29 0a 0a 09 20 20 28 65 6c 73 65 0a 09 20  )))...  (else.. 
4130: 20 20 28 70 72 69 6e 74 20 22 45 52 52 4f 52 3a    (print "ERROR:
4140: 20 75 6e 6b 6e 6f 77 6e 20 74 6f 6b 65 6e 20 22   unknown token "
4150: 20 74 6f 6b 65 6e 20 22 20 6f 6e 20 6c 69 6e 65   token " on line
4160: 20 22 20 28 6c 65 78 65 72 2d 67 65 74 2d 6c 69   " (lexer-get-li
4170: 6e 65 29 29 0a 09 20 20 20 28 6c 6f 6f 70 20 28  ne))..   (loop (
4180: 6c 65 78 65 72 29 29 29 29 29 29 29 29 0a 20 20  lexer)))))))).  
4190: 20 20 20 0a                                         .