NB. circuit primitives or =: +. nor =: ([: -. +.)"0 and =: *. nand =: ([: -. *.)"0 not =: -. NB. circuit models bitOr =: monad define ('a' ; 'b') =. y. a or b ) bitAnd =: monad define ('a' ; 'b') =. y. a and b ) bitNot =: not NB. half adder bitHalfAdder =: monad define ('a' ; 'b') =. y. bitOr (bitAnd a , bitNot b) , bitAnd (bitNot a) , b ) bitXor =: bitHalfAdder bitAdder =: monad define ('a' ; 'b' ; 'cin') =. y. t =. bitHalfAdder a , b g =. bitAnd a , b p =. bitAnd t , cin (bitOr g , p) , bitHalfAdder t , cin ) wireOutput =: monad define ('pin' ; 'outputs') =. y. pin from outputs ) twoBitAdder =: monad define ('a1' ; 'a0' ; 'b1' ; 'b0') =. y. t0 =. bitAdder a0 , b0 , 0 t1 =. bitAdder a1 , b1 , wireOutput 0 ; t0 (wireOutput 0 1 ; t1) , wireOutput 1 ; t0 )