This source listing assumes that we’ve created a wires directory and installed it as a package as described in setup.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #lang br/quicklang (module+ reader (provide read-syntax)) (define (read-syntax path port) (define wire-datums (for/list ([wire-str (in-lines port)]) (format-datum '(wire ~a) wire-str))) (strip-bindings #`(module wires-mod wires/main #,@wire-datums))) (provide #%module-begin) (define-macro-cases wire [(wire ARG -> ID) #'(define/display (ID) (val ARG))] [(wire OP ARG -> ID) #'(wire (OP (val ARG)) -> ID)] [(wire ARG1 OP ARG2 -> ID) #'(wire (OP (val ARG1) (val ARG2)) -> ID)] [else #'(void)]) (provide wire) (define-macro (define/display (ID) BODY) #'(begin (define (ID) BODY) (module+ main (displayln (format "~a: ~a" 'ID (ID)))))) (define val (let ([val-cache (make-hash)]) (lambda (num-or-wire) (if (number? num-or-wire) num-or-wire (hash-ref! val-cache num-or-wire num-or-wire))))) (define (mod-16bit x) (modulo x 65536)) (define-macro (define-16bit ID PROC-ID) #'(define ID (compose1 mod-16bit PROC-ID))) (define-16bit AND bitwise-and) (define-16bit OR bitwise-ior) (define-16bit NOT bitwise-not) (define-16bit LSHIFT arithmetic-shift) (define (RSHIFT x y) (LSHIFT x (- y))) (provide AND OR NOT LSHIFT RSHIFT) |
1 2 3 4 5 6 7 8 9 | #lang wires x AND y -> d x OR y -> e x LSHIFT 2 -> f y RSHIFT 2 -> g NOT x -> h NOT y -> i 123 -> x 456 -> y |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 | #lang wires bn RSHIFT 2 -> bo lf RSHIFT 1 -> ly fo RSHIFT 3 -> fq cj OR cp -> cq fo OR fz -> ga t OR s -> u lx -> a NOT ax -> ay he RSHIFT 2 -> hf lf OR lq -> lr lr AND lt -> lu dy OR ej -> ek 1 AND cx -> cy hb LSHIFT 1 -> hv 1 AND bh -> bi ih AND ij -> ik c LSHIFT 1 -> t ea AND eb -> ed km OR kn -> ko NOT bw -> bx ci OR ct -> cu NOT p -> q lw OR lv -> lx NOT lo -> lp fp OR fv -> fw o AND q -> r dh AND dj -> dk ap LSHIFT 1 -> bj bk LSHIFT 1 -> ce NOT ii -> ij gh OR gi -> gj kk RSHIFT 1 -> ld lc LSHIFT 1 -> lw lb OR la -> lc 1 AND am -> an gn AND gp -> gq lf RSHIFT 3 -> lh e OR f -> g lg AND lm -> lo ci RSHIFT 1 -> db cf LSHIFT 1 -> cz bn RSHIFT 1 -> cg et AND fe -> fg is OR it -> iu kw AND ky -> kz ck AND cl -> cn bj OR bi -> bk gj RSHIFT 1 -> hc iu AND jf -> jh NOT bs -> bt kk OR kv -> kw ks AND ku -> kv hz OR ik -> il b RSHIFT 1 -> v iu RSHIFT 1 -> jn fo RSHIFT 5 -> fr be AND bg -> bh ga AND gc -> gd hf OR hl -> hm ld OR le -> lf as RSHIFT 5 -> av fm OR fn -> fo hm AND ho -> hp lg OR lm -> ln NOT kx -> ky kk RSHIFT 3 -> km ek AND em -> en NOT ft -> fu NOT jh -> ji jn OR jo -> jp gj AND gu -> gw d AND j -> l et RSHIFT 1 -> fm jq OR jw -> jx ep OR eo -> eq lv LSHIFT 15 -> lz NOT ey -> ez jp RSHIFT 2 -> jq eg AND ei -> ej NOT dm -> dn jp AND ka -> kc as AND bd -> bf fk OR fj -> fl dw OR dx -> dy lj AND ll -> lm ec AND ee -> ef fq AND fr -> ft NOT kp -> kq ki OR kj -> kk cz OR cy -> da as RSHIFT 3 -> au an LSHIFT 15 -> ar fj LSHIFT 15 -> fn 1 AND fi -> fj he RSHIFT 1 -> hx lf RSHIFT 2 -> lg kf LSHIFT 15 -> kj dz AND ef -> eh ib OR ic -> id lf RSHIFT 5 -> li bp OR bq -> br NOT gs -> gt fo RSHIFT 1 -> gh bz AND cb -> cc ea OR eb -> ec lf AND lq -> ls NOT l -> m hz RSHIFT 3 -> ib NOT di -> dj NOT lk -> ll jp RSHIFT 3 -> jr jp RSHIFT 5 -> js NOT bf -> bg s LSHIFT 15 -> w eq LSHIFT 1 -> fk jl OR jk -> jm hz AND ik -> im dz OR ef -> eg 1 AND gy -> gz la LSHIFT 15 -> le br AND bt -> bu NOT cn -> co v OR w -> x d OR j -> k 1 AND gd -> ge ia OR ig -> ih NOT go -> gp NOT ed -> ee jq AND jw -> jy et OR fe -> ff aw AND ay -> az ff AND fh -> fi ir LSHIFT 1 -> jl gg LSHIFT 1 -> ha x RSHIFT 2 -> y db OR dc -> dd bl OR bm -> bn ib AND ic -> ie x RSHIFT 3 -> z lh AND li -> lk ce OR cd -> cf NOT bb -> bc hi AND hk -> hl NOT gb -> gc 1 AND r -> s fw AND fy -> fz fb AND fd -> fe 1 AND en -> eo z OR aa -> ab bi LSHIFT 15 -> bm hg OR hh -> hi kh LSHIFT 1 -> lb cg OR ch -> ci 1 AND kz -> la gf OR ge -> gg gj RSHIFT 2 -> gk dd RSHIFT 2 -> de NOT ls -> lt lh OR li -> lj jr OR js -> jt au AND av -> ax 0 -> c he AND hp -> hr id AND if -> ig et RSHIFT 5 -> ew bp AND bq -> bs e AND f -> h ly OR lz -> ma 1 AND lu -> lv NOT jd -> je ha OR gz -> hb dy RSHIFT 1 -> er iu RSHIFT 2 -> iv NOT hr -> hs as RSHIFT 1 -> bl kk RSHIFT 2 -> kl b AND n -> p ln AND lp -> lq cj AND cp -> cr dl AND dn -> do ci RSHIFT 2 -> cj as OR bd -> be ge LSHIFT 15 -> gi hz RSHIFT 5 -> ic dv LSHIFT 1 -> ep kl OR kr -> ks gj OR gu -> gv he RSHIFT 5 -> hh NOT fg -> fh hg AND hh -> hj b OR n -> o jk LSHIFT 15 -> jo gz LSHIFT 15 -> hd cy LSHIFT 15 -> dc kk RSHIFT 5 -> kn ci RSHIFT 3 -> ck at OR az -> ba iu RSHIFT 3 -> iw ko AND kq -> kr NOT eh -> ei aq OR ar -> as iy AND ja -> jb dd RSHIFT 3 -> df bn RSHIFT 3 -> bp 1 AND cc -> cd at AND az -> bb x OR ai -> aj kk AND kv -> kx ao OR an -> ap dy RSHIFT 3 -> ea x RSHIFT 1 -> aq eu AND fa -> fc kl AND kr -> kt ia AND ig -> ii df AND dg -> di NOT fx -> fy k AND m -> n bn RSHIFT 5 -> bq km AND kn -> kp dt LSHIFT 15 -> dx hz RSHIFT 2 -> ia aj AND al -> am cd LSHIFT 15 -> ch hc OR hd -> he he RSHIFT 3 -> hg bn OR by -> bz NOT kt -> ku z AND aa -> ac NOT ak -> al cu AND cw -> cx NOT ie -> if dy RSHIFT 2 -> dz ip LSHIFT 15 -> it de OR dk -> dl au OR av -> aw jg AND ji -> jj ci AND ct -> cv dy RSHIFT 5 -> eb hx OR hy -> hz eu OR fa -> fb gj RSHIFT 3 -> gl fo AND fz -> gb 1 AND jj -> jk jp OR ka -> kb de AND dk -> dm ex AND ez -> fa df OR dg -> dh iv OR jb -> jc x RSHIFT 5 -> aa NOT hj -> hk NOT im -> in fl LSHIFT 1 -> gf hu LSHIFT 15 -> hy iq OR ip -> ir iu RSHIFT 5 -> ix NOT fc -> fd NOT el -> em ck OR cl -> cm et RSHIFT 3 -> ev hw LSHIFT 1 -> iq ci RSHIFT 5 -> cl iv AND jb -> jd dd RSHIFT 5 -> dg as RSHIFT 2 -> at NOT jy -> jz af AND ah -> ai 1 AND ds -> dt jx AND jz -> ka da LSHIFT 1 -> du fs AND fu -> fv jp RSHIFT 1 -> ki iw AND ix -> iz iw OR ix -> iy eo LSHIFT 15 -> es ev AND ew -> ey ba AND bc -> bd fp AND fv -> fx jc AND je -> jf et RSHIFT 2 -> eu kg OR kf -> kh iu OR jf -> jg er OR es -> et fo RSHIFT 2 -> fp NOT ca -> cb bv AND bx -> by u LSHIFT 1 -> ao cm AND co -> cp y OR ae -> af bn AND by -> ca 1 AND ke -> kf jt AND jv -> jw fq OR fr -> fs dy AND ej -> el NOT kc -> kd ev OR ew -> ex dd OR do -> dp NOT cv -> cw gr AND gt -> gu dd RSHIFT 1 -> dw NOT gw -> gx NOT iz -> ja 1 AND io -> ip NOT ag -> ah b RSHIFT 5 -> f NOT cr -> cs kb AND kd -> ke jr AND js -> ju cq AND cs -> ct il AND in -> io NOT ju -> jv du OR dt -> dv dd AND do -> dq b RSHIFT 2 -> d jm LSHIFT 1 -> kg NOT dq -> dr bo OR bu -> bv gk OR gq -> gr he OR hp -> hq NOT h -> i hf AND hl -> hn gv AND gx -> gy x AND ai -> ak bo AND bu -> bw hq AND hs -> ht hz RSHIFT 1 -> is gj RSHIFT 5 -> gm g AND i -> j gk AND gq -> gs dp AND dr -> ds b RSHIFT 3 -> e gl AND gm -> go gl OR gm -> gn y AND ae -> ag hv OR hu -> hw 1674 -> b ab AND ad -> ae NOT ac -> ad 1 AND ht -> hu NOT hn -> ho |