# 05may21 Software Lab. Alexander Burger

   ### Primary data types ###

   cnt   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxS010
   big   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxS100
   sym   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1000
   pair  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0000


         Bignum
         |
         V
      +-----+-----+
      | DIG |  |  |
      +-----+--+--+
               |
               V
            +-----+-----+
            | DIG |  |  |
            +-----+--+--+
                     |
                     V
                  +-----+-----+
                  | DIG | CNT |
                  +-----+-----+


      Pair
      |
      V
      +-----+-----+
      | CAR | CDR |
      +-----+-----+


            Symbol
            |
            V
      +-----+-----+                                +-----+-----+
      |  |  | VAL |                                |'cba'|'fed'|
      +--+--+-----+                                +-----+-----+
         | tail                                       ^
         |                                            |
         V                                            | name
         +-----+-----+     +-----+-----+     +-----+--+--+
         |  |  |  ---+---> | KEY |  ---+---> |  |  |  |  |
         +--+--+-----+     +-----+-----+     +--+--+-----+
            |                                   |
            V                                   V
            +-----+-----+                       +-----+-----+
            | VAL | KEY |                       | VAL | KEY |
            +-----+-----+                       +-----+-----+


      NIL:  /
            |
            V
      +-----+-----+-----+-----+
      |'LIN'|  /  |  /  |  /  |
      +-----+--+--+-----+-----+


   Symbol tail
      Internal/Transient
         0010 Short name
         0100 Long name
         0000 Properties

      External
         1010 Short name
         1000 Properties

   Name final short
      Internals, Transients
         0000.xxxxxxx.xxxxxxx.xxxxxxx.xxxxxxx.xxxxxxx.xxxxxxx.xxxxxxx0010
           60      52      44      36      28      20      12       4

      Externals
         42 bit Object (4 Tera objects)
         16 bit File (64 K files)
          2 bit Status
            Loaded    01........
            Dirty     10........
            Deleted   11........

         1+2 Bytes: 1 file, 64K objects                  {177777}
         1+3 Bytes: 16 files, 1M objects               {O3777777}
         1+4 Bytes: 256 files, 16M objects           {OO77777777}
         1+5 Bytes: 256 files, 4G objects         {OO37777777777}
         1+6 Bytes: 65536 files, 4G objects     {OOOO37777777777}
         1+8 Bytes: 65536 files, 4T objects  {OOOO77777777777777}
         (2 + 10 + 8 + 12 + 8 + 20)
         xx.xxxxxxxxx.xxxxxxx.xxxxxxxxxxx.xxxxxxx.xxxxxxxxxxxxxxxxxxxE010
           obj       file    obj         file    obj
                     ^6      ^5      ^4      ^3      ^2


   ### Heap ###

      Heaps, Avail
      |
      |  +-----------------------+
      |  |                       |
      V  |                       V
      +--+--+-----+-----+-----+-----+-----+---     ---+-----+-----+-----+
      |  |  |     |           |  /  |     |    ...    |  |  |     |  |  |
      +-----+-----+-----+-----+-----+-----+---     ---+--+--+-----+--+--+
                                                         |           |
                                                         |           +-----> Heaps
                                                         |
                                                         +-----> Avail


   ### Stack ###

      Saved values:

         ^
         |
         +---- LINK
               val  <-- Link


      Bind frame:

                        ^
               Expr     |
               LINK ----+
                @
         +---> [@]
         |
         +---- LINK
               sym1
         +---> val1
         .
         .
         +---- LINK
               symN
               valN  <-- Bind


      VarArgs frame:

            [Bind frame]
         ^
         |
         +---- LINK
               arg1 <------------+
         +-------   <-- Next     |
         |                       |
         |     LINK -------------+
         | +-> arg2
         +-|->   ----------------+
           |                     |
           +-- LINK              |
               arg3 <-- Link     |
                /   <------------+


      Apply args:

         ^
         |
         +---- LINK
               fun  <---+  <-----+
               zero     |        |
         +---- cdr      |        |
         |     car  ----+  <-- E |
         |                       |
         |     LINK -------------+
         | +-> val1 <---+
         | |   zero     |
         | |   cdr1 ----|-----+
         +---> car1 ----+     |
           |                  |
           +-- LINK           |
         +---> valN  <-- Link |
         |     zero           |
         |      /             |
         +---- carN <---------+


      I/O frame:
                        ^
               put/get  |
               pid      |
               fd       |
               LINK ----+  <-- InFrames, OutFrames, ErrFrames, CtlFrames


      Catch frame:
                        ^
               [rst]    |
               [env]    |
               co       |
               fin      |
               tag      |
               LINK ----+  <-- Catch


      Coroutine:

               [rst]
               [env]
               ...
               [@]
               lim
               prg
               org
         +---- next
         | +-> prv
         | |   tag   <----- Coroutines
         | |
         | |
         | |   [rst]
         | |   [env]
         | |   ...
         | |   [@]
         | |   lim
         | |   prg
         | |   org
         | |   next
         | +-- prv
         +---> tag


      IPC pipes:

                  +--------------------------+ Mic
                  |
                  |  +-----------------+ Tell         <Child>
                  |  |
                  |  +-----------------> Hear
      <Parent>    |  |
                  |  |
         Spkr <---+  |
                  |  |
                  |  |
                  |  +-----------------+ Tell
                  |  |
                  |  +-----------------> Hear         <Child>
                  |
                  +--------------------------+ Mic


   ### Database file ###

                  +-------------+-+-------------+-+----+
      Block 0:    |   Free       0|   Next       0| << |
                  +-------------+-+-------------+-+----+
                  0               BLK                  2*Blk+1


                  +-------------+-+
      Free:       |   Link       0|
                  +-------------+-+
                  0


                  +-------------+-+----
      ID-Block:   |   Link       1| Data
                  +-------------+-+----
                  0              BLK


                  +-------------+-+----
      EXT-Block:  |   Link       n| Data
                  +-------------+-+----
                  0              BLK


   ### Assumptions ###

   - 8 bit per byte
   - 64 bit per word
   - Stack grows downwards
   - sizeof(float) = 4 bytes
   - sizeof(double) = 8 bytes
