It was thus said that the Great Cameron Kaiser once stated:
     Nope.  Made
by Thinking Machine Inc out of Boston.  The first model used
 a custom 1-bit CPU for each node (of which there were 65,536). 
 Awesome. Is there any documentation on the instruction set? This sounds like
 something ripe for further study. 
 
  _The Connection Machine_ by W. Daniel Hillis contains quite a bit of
infomration on the machine:
          The host talks to the processor/memory cells through a
        microcontroller.  The purpose of the microcontroller is to act as a
        bandwidth amplifier between the host and the processors.  Because
        the processors execute an extremely simple bit-at-a-time instruction
        set, they are able to execute instructions at a higher rate than the
        host is able to specify.  Instead, the host specifies higher-level
        _macroinstructions_, which are interpreted by the microcontroller to
        produce _nanoinstructions._ It is the nanoinstructions that are
        executed directly by the processors.  The instructions executed by
        the microcontroller that specify how this interpretation is to take
        place are called _microinstructions._
          Thus there are four instruction sets to be kept straight:
        host-instructions (executed by the host), macroinstructions
        (interpreted by the microcontroller), microinstructions (executed by
        the microcontroller), and nanoinstructions (executed by the
        individual processor memory cells) ...  Only the nanoinstruction set
        is described in this document.
  He gives an example though, of the macroinstruction:
                ADD 2000,1000, 8        ; add the eight bits stored in
                                        ; locations 2000-2007 to the eight
                                        ; bits stored in locations
                                        ; 1000-1007.
  generates the following sequence of nanoinstructions
A-addr B-addr Readflag Writeflag MEM-ALU [1]    Flag-ALU CC-flag Condition-sense
----   -----  -------- ------- ---------        -------  ------ ----------------
2000    1000    ZF [2]  1       A x B x F       AB+BC+AC  ZF    0
2001    1001    1       1       A x B x F       AB+BC+AC  ZF    0
2002    1002    1       1       A x B x F       AB+BC+AC  ZF    0
2003    1003    1       1       A x B x F       AB+BC+AC  ZF    0
2004    1004    1       1       A x B x F       AB+BC+AC  ZF    0
2005    1005    1       1       A x B x F       AB+BC+AC  ZF    0
2006    1006    1       1       A x B x F       AB+BC+AC  ZF    0
2007    1007    1       1       A x B x F       AB+BC+AC  ZF    0
        [1]     this is A xor B xor F
        [2]     ZF = Zero Flag
          Each bit in the source and destination is addressed in sequene,
        starting with the least significant bit.  These two bits are added
        together with the flag bit taken from flag 1, where it was stored on
        the previous cycle.  On the first cycle there is no incoming flag,
        so it is taken from the zero flag, which is always 0.  The zero flag
        is also used for conditionalization, which a COND-sense of 0,
        because this operation is to be performed by all the processing
        elements.
          The function for the memory is the exclusive-or function of the
        three inputs ... The flag is the majority function of the three
        inputs and is 1 whenever two or more of the inputs are 1.  This
        sequence of nanoinstructions can be generated by the microcontroller
        by means of a simple macrocoded loop that increments the address of
        the memory locations.
  The machine as a whole is SIMD, and the programming examples in the book
are in a form of LISP.  He give the following path length algorithm:
        1. Label all vertices with +inf
        2. Label vertex A with 0.
        3. Label every vectex, except A, with 1 plus the minimum of its
           neightbor's labels.  Repeat this step until the label of vertex B
           is finite (This step takes one cycle, and the loop itself takes N
           cycles, where N is the path length between A and B).
        4. Terminate.  The label of B is the answer.
  And the code:
        ; find the path length between nodes A and B in graph G
        (DEFUN PATH-LENGTH (A B G)
                a(SETF (LABEL *G) +INF)
                 (SETF (LABEL  A) 0)
                 (LOOP UNTIL (< (LABEL B) +INF)
                        DO a(SETF (LABEL *(REMOVE A G))
                                  (1+ (bMIN a(LABEL *(NEIGHBORS *G))))))
                 (LABEL B))
  The "a" represents the "alpha" expansion, and "b"
represents "beta
reduction" (which can be loosely translated as MAP and REDUCE respectively).
Hillis describes "a" as "Give me a zillion of these".  The
"*" represents an
escape mechanism where by the alpha expansion is avoided if you already have
a zillion of something.  Some examples:
        a(+ *x 1)               == (a+ x a1)
        a(+ (* *x 2) 1)         == (a+ (a* x a2) a1)
                A = [A B C]
                X = [X Y Z]
        (CONS A X)              => ([A B C ] . [X Y Z])
        a(CONS *A *X)           => [(A . X) (B . Y) (C . Z)]
        a(CONS  A *X)           => [([A B C] . X) ([A B C] . Y) ([A B C] . Z)]
        (b+   '{A->1 B->2 C->3})   => 6
        (bAND '[T T NIL T])         => NIL
        (bMAX  {1 3 5 7})               => 7
  -spc(I do recomend the book---it's very informative)