├── .gitignore ├── README.md ├── dots ├── applyLin-t21.dot ├── applyLin-t22.dot ├── applyLin-v23.dot ├── applyLin-v34.dot ├── applyLin-v42.dot ├── applyLin-v45.dot ├── bitonic-up-1.dot ├── bitonic-up-2.dot ├── bitonic-up-3.dot ├── bitonic-up-4.dot ├── composeLin-t222.dot ├── composeLin-t232.dot ├── composeLin-v234.dot ├── crcSKf-rt2-no-opt.dot ├── crcSKf-rt2.dot ├── dotsp-pt1.dot ├── dotsp-pt2.dot ├── dotsp-pt3.dot ├── dotsp-pt4.dot ├── dotsp-t2t2.dot ├── dotsp-v3t2.dot ├── evalPoly-rt4.dot ├── fibS.dot ├── lsumsp-lt4.dot ├── lsumsp-rt4.dot ├── lsumsp-rt5.dot ├── map-t3.dot ├── map-t4.dot ├── map-v6.dot ├── powers-rt4-no-opt.dot ├── powers-rt4.dot ├── shiftR-iota-v3.dot ├── sum-2.dot ├── sum-4a.dot ├── sum-4b.dot ├── sum-p.dot ├── sum-t4.dot ├── sum-v6-0.dot ├── sum-v6.dot ├── sumSquare-p.dot ├── sumSquare-t2.dot ├── sumSquare-t3.dot ├── sumSquare-t4.dot ├── transpose-pt4.dot └── transpose-t4p.dot ├── haskell-to-hardware.lhs ├── macros.tex ├── makefile ├── mine.fmt ├── notes.md └── todo.md /.gitignore: -------------------------------------------------------------------------------- 1 | figures/*.pdf 2 | *~ 3 | Junk* 4 | Old* 5 | Stuff 6 | Unused/ 7 | 8 | *.aux 9 | *.log 10 | *.nav 11 | *.out 12 | *.ptb 13 | *.snm 14 | *.toc 15 | 16 | haskell-to-hardware.tex 17 | haskell-to-hardware.pdf 18 | 19 | web-token 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Talk: *From Haskell to Hardware via CCCs* 2 | 3 | This talk describes my project at Tabula Inc for compiling Haskell to hardware. 4 | 5 | * [My blog](http://conal.net/blog) contains a few articles about the approach to compiling Haskell to hardware. 6 | * You can find [the slides (PDF)](http://conal.net/talks/haskell-to-hardware.pdf) in [my talks folder](http://conal.net/talks/). 7 | * There is a [video of the BayHac 2015 version](http://begriffs.com/posts/2015-06-28-haskell-to-hardware.html), thanks to Joe Nelson. 8 | * The compiler is being [developed openly](https://github.com/conal/lambda-ccc/) and is shared freely. 9 | * I gave an earlier version of this talk first at IFIP Working Group 2.8 (functional programming) in 2014 and a [newer version](https://galois.com/blog/2015/04/tech-talk-haskell-hardware-via-cccs/) at Galois in Portland in April 2015. 10 | The video isn't as good as the BayHac version, however, so I don't recommend it. 11 | * There is a [Reddit discussion of the slides](https://www.reddit.com/r/haskell/comments/31yy5z/from_haskell_to_hardware_via_cccs/) (Galois version). 12 | 13 | Abstract: 14 | 15 |
16 | 17 | For the last several years, speed improvements in computing come mainly from increasing parallelism. Imperative programming, however, makes parallelization very difficult due to the many possible dependencies implied by effects. For decades, pure functional programming has held the promise of parallel execution while retaining the very simple semantics that enables practical, rigorous reasoning. This talk describes a prototype compiler from Haskell (not a library) to low-level hardware descriptions for massively parallel execution on reprogrammable logic devices. The compiler works by monomorphizing, miscellaneous other transformations, and conversion to the vocabulary of cartesian closed categories (CCCs), as captured in a small collection of Haskell type classes. One instance of those classes provides an interpretation as parallel circuits. I will show many examples of simple Haskell programs and corresponding compiler-generated circuits. 18 | 19 |
20 | -------------------------------------------------------------------------------- /dots/applyLin-t21.dot: -------------------------------------------------------------------------------- 1 | digraph applyLin_t21 { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | bgcolor=transparent; 5 | ranksep=1.5; 6 | c0 [label="{In|{|||||||||||}}"]; 7 | c1 [label="{{|}|Out}"]; 8 | c2 [label="{{|}|+|{}}"]; 9 | c3 [label="{{|}|+|{}}"]; 10 | c4 [label="{{|}|+|{}}"]; 11 | c5 [label="{{|}|+|{}}"]; 12 | c6 [label="{{|}|+|{}}"]; 13 | c7 [label="{{|}|+|{}}"]; 14 | c8 [label="{{|}|×|{}}"]; 15 | c9 [label="{{|}|×|{}}"]; 16 | c10 [label="{{|}|×|{}}"]; 17 | c11 [label="{{|}|×|{}}"]; 18 | c12 [label="{{|}|×|{}}"]; 19 | c13 [label="{{|}|×|{}}"]; 20 | c14 [label="{{|}|×|{}}"]; 21 | c15 [label="{{|}|×|{}}"]; 22 | c4:Out0 -> c1:In0 [label="32",fontsize=10]; 23 | c7:Out0 -> c1:In1 [label="32",fontsize=10]; 24 | c8:Out0 -> c2:In0 [label="32",fontsize=10]; 25 | c9:Out0 -> c2:In1 [label="32",fontsize=10]; 26 | c10:Out0 -> c3:In0 [label="32",fontsize=10]; 27 | c11:Out0 -> c3:In1 [label="32",fontsize=10]; 28 | c2:Out0 -> c4:In0 [label="32",fontsize=10]; 29 | c3:Out0 -> c4:In1 [label="32",fontsize=10]; 30 | c12:Out0 -> c5:In0 [label="32",fontsize=10]; 31 | c13:Out0 -> c5:In1 [label="32",fontsize=10]; 32 | c14:Out0 -> c6:In0 [label="32",fontsize=10]; 33 | c15:Out0 -> c6:In1 [label="32",fontsize=10]; 34 | c5:Out0 -> c7:In0 [label="32",fontsize=10]; 35 | c6:Out0 -> c7:In1 [label="32",fontsize=10]; 36 | c0:Out0 -> c8:In0 [label="32",fontsize=10]; 37 | c0:Out8 -> c8:In1 [label="32",fontsize=10]; 38 | c0:Out1 -> c9:In0 [label="32",fontsize=10]; 39 | c0:Out9 -> c9:In1 [label="32",fontsize=10]; 40 | c0:Out2 -> c10:In0 [label="32",fontsize=10]; 41 | c0:Out10 -> c10:In1 [label="32",fontsize=10]; 42 | c0:Out3 -> c11:In0 [label="32",fontsize=10]; 43 | c0:Out11 -> c11:In1 [label="32",fontsize=10]; 44 | c0:Out4 -> c12:In0 [label="32",fontsize=10]; 45 | c0:Out8 -> c12:In1 [label="32",fontsize=10]; 46 | c0:Out5 -> c13:In0 [label="32",fontsize=10]; 47 | c0:Out9 -> c13:In1 [label="32",fontsize=10]; 48 | c0:Out6 -> c14:In0 [label="32",fontsize=10]; 49 | c0:Out10 -> c14:In1 [label="32",fontsize=10]; 50 | c0:Out7 -> c15:In0 [label="32",fontsize=10]; 51 | c0:Out11 -> c15:In1 [label="32",fontsize=10]; 52 | } 53 | 54 | // Components: 6 add, 8 mul, 14 total. Depth: 3. 55 | -------------------------------------------------------------------------------- /dots/applyLin-t22.dot: -------------------------------------------------------------------------------- 1 | digraph { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | // ratio=1; 5 | ranksep=2.5; 6 | c0 [label="{In|{|||||||||||||||||||}}"]; 7 | c1 [label="{{|}|×|{}}"]; 8 | c2 [label="{{|}|×|{}}"]; 9 | c3 [label="{{|}|×|{}}"]; 10 | c4 [label="{{|}|×|{}}"]; 11 | c5 [label="{{|}|+|{}}"]; 12 | c6 [label="{{|}|+|{}}"]; 13 | c7 [label="{{|}|+|{}}"]; 14 | c8 [label="{{|}|×|{}}"]; 15 | c9 [label="{{|}|×|{}}"]; 16 | c10 [label="{{|}|×|{}}"]; 17 | c11 [label="{{|}|×|{}}"]; 18 | c12 [label="{{|}|+|{}}"]; 19 | c13 [label="{{|}|+|{}}"]; 20 | c14 [label="{{|}|+|{}}"]; 21 | c15 [label="{{|}|×|{}}"]; 22 | c16 [label="{{|}|×|{}}"]; 23 | c17 [label="{{|}|×|{}}"]; 24 | c18 [label="{{|}|×|{}}"]; 25 | c19 [label="{{|}|+|{}}"]; 26 | c20 [label="{{|}|+|{}}"]; 27 | c21 [label="{{|}|+|{}}"]; 28 | c22 [label="{{|}|×|{}}"]; 29 | c23 [label="{{|}|×|{}}"]; 30 | c24 [label="{{|}|×|{}}"]; 31 | c25 [label="{{|}|×|{}}"]; 32 | c26 [label="{{|}|+|{}}"]; 33 | c27 [label="{{|}|+|{}}"]; 34 | c28 [label="{{|}|+|{}}"]; 35 | c29 [label="{{|||}|Out}"]; 36 | c0:Out0 -> c1:In0 [label="32"]; 37 | c0:Out16 -> c1:In1 [label="32"]; 38 | c0:Out1 -> c2:In0 [label="32"]; 39 | c0:Out17 -> c2:In1 [label="32"]; 40 | c0:Out2 -> c3:In0 [label="32"]; 41 | c0:Out18 -> c3:In1 [label="32"]; 42 | c0:Out3 -> c4:In0 [label="32"]; 43 | c0:Out19 -> c4:In1 [label="32"]; 44 | c1:Out0 -> c5:In0 [label="32"]; 45 | c2:Out0 -> c5:In1 [label="32"]; 46 | c3:Out0 -> c6:In0 [label="32"]; 47 | c4:Out0 -> c6:In1 [label="32"]; 48 | c5:Out0 -> c7:In0 [label="32"]; 49 | c6:Out0 -> c7:In1 [label="32"]; 50 | c0:Out4 -> c8:In0 [label="32"]; 51 | c0:Out16 -> c8:In1 [label="32"]; 52 | c0:Out5 -> c9:In0 [label="32"]; 53 | c0:Out17 -> c9:In1 [label="32"]; 54 | c0:Out6 -> c10:In0 [label="32"]; 55 | c0:Out18 -> c10:In1 [label="32"]; 56 | c0:Out7 -> c11:In0 [label="32"]; 57 | c0:Out19 -> c11:In1 [label="32"]; 58 | c8:Out0 -> c12:In0 [label="32"]; 59 | c9:Out0 -> c12:In1 [label="32"]; 60 | c10:Out0 -> c13:In0 [label="32"]; 61 | c11:Out0 -> c13:In1 [label="32"]; 62 | c12:Out0 -> c14:In0 [label="32"]; 63 | c13:Out0 -> c14:In1 [label="32"]; 64 | c0:Out8 -> c15:In0 [label="32"]; 65 | c0:Out16 -> c15:In1 [label="32"]; 66 | c0:Out9 -> c16:In0 [label="32"]; 67 | c0:Out17 -> c16:In1 [label="32"]; 68 | c0:Out10 -> c17:In0 [label="32"]; 69 | c0:Out18 -> c17:In1 [label="32"]; 70 | c0:Out11 -> c18:In0 [label="32"]; 71 | c0:Out19 -> c18:In1 [label="32"]; 72 | c15:Out0 -> c19:In0 [label="32"]; 73 | c16:Out0 -> c19:In1 [label="32"]; 74 | c17:Out0 -> c20:In0 [label="32"]; 75 | c18:Out0 -> c20:In1 [label="32"]; 76 | c19:Out0 -> c21:In0 [label="32"]; 77 | c20:Out0 -> c21:In1 [label="32"]; 78 | c0:Out12 -> c22:In0 [label="32"]; 79 | c0:Out16 -> c22:In1 [label="32"]; 80 | c0:Out13 -> c23:In0 [label="32"]; 81 | c0:Out17 -> c23:In1 [label="32"]; 82 | c0:Out14 -> c24:In0 [label="32"]; 83 | c0:Out18 -> c24:In1 [label="32"]; 84 | c0:Out15 -> c25:In0 [label="32"]; 85 | c0:Out19 -> c25:In1 [label="32"]; 86 | c22:Out0 -> c26:In0 [label="32"]; 87 | c23:Out0 -> c26:In1 [label="32"]; 88 | c24:Out0 -> c27:In0 [label="32"]; 89 | c25:Out0 -> c27:In1 [label="32"]; 90 | c26:Out0 -> c28:In0 [label="32"]; 91 | c27:Out0 -> c28:In1 [label="32"]; 92 | c7:Out0 -> c29:In0 [label="32"]; 93 | c14:Out0 -> c29:In1 [label="32"]; 94 | c21:Out0 -> c29:In2 [label="32"]; 95 | c28:Out0 -> c29:In3 [label="32"]; 96 | } 97 | -------------------------------------------------------------------------------- /dots/applyLin-v23.dot: -------------------------------------------------------------------------------- 1 | digraph applyLin_v23 { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | bgcolor=transparent; 5 | ranksep=1; 6 | c2 [label="{In|{|||||||}}"]; 7 | c3 [label="{{||}|Out}"]; 8 | c4 [label="{{|}|+|{}}"]; 9 | c5 [label="{{|}|+|{}}"]; 10 | c6 [label="{{|}|+|{}}"]; 11 | c7 [label="{{|}|×|{}}"]; 12 | c8 [label="{{|}|×|{}}"]; 13 | c9 [label="{{|}|×|{}}"]; 14 | c10 [label="{{|}|×|{}}"]; 15 | c11 [label="{{|}|×|{}}"]; 16 | c12 [label="{{|}|×|{}}"]; 17 | c4:Out0 -> c3:In0 [label="32",fontsize=10]; 18 | c5:Out0 -> c3:In1 [label="32",fontsize=10]; 19 | c6:Out0 -> c3:In2 [label="32",fontsize=10]; 20 | c7:Out0 -> c4:In0 [label="32",fontsize=10]; 21 | c8:Out0 -> c4:In1 [label="32",fontsize=10]; 22 | c9:Out0 -> c5:In0 [label="32",fontsize=10]; 23 | c10:Out0 -> c5:In1 [label="32",fontsize=10]; 24 | c11:Out0 -> c6:In0 [label="32",fontsize=10]; 25 | c12:Out0 -> c6:In1 [label="32",fontsize=10]; 26 | c2:Out0 -> c7:In0 [label="32",fontsize=10]; 27 | c2:Out6 -> c7:In1 [label="32",fontsize=10]; 28 | c2:Out1 -> c8:In0 [label="32",fontsize=10]; 29 | c2:Out7 -> c8:In1 [label="32",fontsize=10]; 30 | c2:Out2 -> c9:In0 [label="32",fontsize=10]; 31 | c2:Out6 -> c9:In1 [label="32",fontsize=10]; 32 | c2:Out3 -> c10:In0 [label="32",fontsize=10]; 33 | c2:Out7 -> c10:In1 [label="32",fontsize=10]; 34 | c2:Out4 -> c11:In0 [label="32",fontsize=10]; 35 | c2:Out6 -> c11:In1 [label="32",fontsize=10]; 36 | c2:Out5 -> c12:In0 [label="32",fontsize=10]; 37 | c2:Out7 -> c12:In1 [label="32",fontsize=10]; 38 | } 39 | 40 | // Components: 3 add, 6 mul, 9 total. Depth: 2. 41 | -------------------------------------------------------------------------------- /dots/applyLin-v34.dot: -------------------------------------------------------------------------------- 1 | digraph { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | // ratio=1; 5 | c0 [label="{In|{||||||||||||||}}"]; 6 | c1 [label="{{|}|×|{}}"]; 7 | c2 [label="{{|}|×|{}}"]; 8 | c3 [label="{{|}|×|{}}"]; 9 | c4 [label="{{|}|+|{}}"]; 10 | c5 [label="{{|}|+|{}}"]; 11 | c6 [label="{{|}|×|{}}"]; 12 | c7 [label="{{|}|×|{}}"]; 13 | c8 [label="{{|}|×|{}}"]; 14 | c9 [label="{{|}|+|{}}"]; 15 | c10 [label="{{|}|+|{}}"]; 16 | c11 [label="{{|}|×|{}}"]; 17 | c12 [label="{{|}|×|{}}"]; 18 | c13 [label="{{|}|×|{}}"]; 19 | c14 [label="{{|}|+|{}}"]; 20 | c15 [label="{{|}|+|{}}"]; 21 | c16 [label="{{|}|×|{}}"]; 22 | c17 [label="{{|}|×|{}}"]; 23 | c18 [label="{{|}|×|{}}"]; 24 | c19 [label="{{|}|+|{}}"]; 25 | c20 [label="{{|}|+|{}}"]; 26 | c21 [label="{{|||}|Out}"]; 27 | c0:Out0 -> c1:In0 [label="32"]; 28 | c0:Out12 -> c1:In1 [label="32"]; 29 | c0:Out1 -> c2:In0 [label="32"]; 30 | c0:Out13 -> c2:In1 [label="32"]; 31 | c0:Out2 -> c3:In0 [label="32"]; 32 | c0:Out14 -> c3:In1 [label="32"]; 33 | c2:Out0 -> c4:In0 [label="32"]; 34 | c3:Out0 -> c4:In1 [label="32"]; 35 | c1:Out0 -> c5:In0 [label="32"]; 36 | c4:Out0 -> c5:In1 [label="32"]; 37 | c0:Out3 -> c6:In0 [label="32"]; 38 | c0:Out12 -> c6:In1 [label="32"]; 39 | c0:Out4 -> c7:In0 [label="32"]; 40 | c0:Out13 -> c7:In1 [label="32"]; 41 | c0:Out5 -> c8:In0 [label="32"]; 42 | c0:Out14 -> c8:In1 [label="32"]; 43 | c7:Out0 -> c9:In0 [label="32"]; 44 | c8:Out0 -> c9:In1 [label="32"]; 45 | c6:Out0 -> c10:In0 [label="32"]; 46 | c9:Out0 -> c10:In1 [label="32"]; 47 | c0:Out6 -> c11:In0 [label="32"]; 48 | c0:Out12 -> c11:In1 [label="32"]; 49 | c0:Out7 -> c12:In0 [label="32"]; 50 | c0:Out13 -> c12:In1 [label="32"]; 51 | c0:Out8 -> c13:In0 [label="32"]; 52 | c0:Out14 -> c13:In1 [label="32"]; 53 | c12:Out0 -> c14:In0 [label="32"]; 54 | c13:Out0 -> c14:In1 [label="32"]; 55 | c11:Out0 -> c15:In0 [label="32"]; 56 | c14:Out0 -> c15:In1 [label="32"]; 57 | c0:Out9 -> c16:In0 [label="32"]; 58 | c0:Out12 -> c16:In1 [label="32"]; 59 | c0:Out10 -> c17:In0 [label="32"]; 60 | c0:Out13 -> c17:In1 [label="32"]; 61 | c0:Out11 -> c18:In0 [label="32"]; 62 | c0:Out14 -> c18:In1 [label="32"]; 63 | c17:Out0 -> c19:In0 [label="32"]; 64 | c18:Out0 -> c19:In1 [label="32"]; 65 | c16:Out0 -> c20:In0 [label="32"]; 66 | c19:Out0 -> c20:In1 [label="32"]; 67 | c5:Out0 -> c21:In0 [label="32"]; 68 | c10:Out0 -> c21:In1 [label="32"]; 69 | c15:Out0 -> c21:In2 [label="32"]; 70 | c20:Out0 -> c21:In3 [label="32"]; 71 | } 72 | -------------------------------------------------------------------------------- /dots/applyLin-v42.dot: -------------------------------------------------------------------------------- 1 | digraph applyLin_v42 { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | bgcolor=transparent; 5 | ranksep="1.5"; 6 | c2 [label="{In|{|||||||||||}}"]; 7 | c3 [label="{{|}|Out}"]; 8 | c4 [label="{{|}|+|{}}"]; 9 | c5 [label="{{|}|+|{}}"]; 10 | c6 [label="{{|}|+|{}}"]; 11 | c7 [label="{{|}|+|{}}"]; 12 | c8 [label="{{|}|+|{}}"]; 13 | c9 [label="{{|}|+|{}}"]; 14 | c10 [label="{{|}|×|{}}"]; 15 | c11 [label="{{|}|×|{}}"]; 16 | c12 [label="{{|}|×|{}}"]; 17 | c13 [label="{{|}|×|{}}"]; 18 | c14 [label="{{|}|×|{}}"]; 19 | c15 [label="{{|}|×|{}}"]; 20 | c16 [label="{{|}|×|{}}"]; 21 | c17 [label="{{|}|×|{}}"]; 22 | c4:Out0 -> c3:In0 [label="32",fontsize=10]; 23 | c7:Out0 -> c3:In1 [label="32",fontsize=10]; 24 | c10:Out0 -> c4:In0 [label="32",fontsize=10]; 25 | c5:Out0 -> c4:In1 [label="32",fontsize=10]; 26 | c11:Out0 -> c5:In0 [label="32",fontsize=10]; 27 | c6:Out0 -> c5:In1 [label="32",fontsize=10]; 28 | c12:Out0 -> c6:In0 [label="32",fontsize=10]; 29 | c13:Out0 -> c6:In1 [label="32",fontsize=10]; 30 | c14:Out0 -> c7:In0 [label="32",fontsize=10]; 31 | c8:Out0 -> c7:In1 [label="32",fontsize=10]; 32 | c15:Out0 -> c8:In0 [label="32",fontsize=10]; 33 | c9:Out0 -> c8:In1 [label="32",fontsize=10]; 34 | c16:Out0 -> c9:In0 [label="32",fontsize=10]; 35 | c17:Out0 -> c9:In1 [label="32",fontsize=10]; 36 | c2:Out0 -> c10:In0 [label="32",fontsize=10]; 37 | c2:Out8 -> c10:In1 [label="32",fontsize=10]; 38 | c2:Out1 -> c11:In0 [label="32",fontsize=10]; 39 | c2:Out9 -> c11:In1 [label="32",fontsize=10]; 40 | c2:Out2 -> c12:In0 [label="32",fontsize=10]; 41 | c2:Out10 -> c12:In1 [label="32",fontsize=10]; 42 | c2:Out3 -> c13:In0 [label="32",fontsize=10]; 43 | c2:Out11 -> c13:In1 [label="32",fontsize=10]; 44 | c2:Out4 -> c14:In0 [label="32",fontsize=10]; 45 | c2:Out8 -> c14:In1 [label="32",fontsize=10]; 46 | c2:Out5 -> c15:In0 [label="32",fontsize=10]; 47 | c2:Out9 -> c15:In1 [label="32",fontsize=10]; 48 | c2:Out6 -> c16:In0 [label="32",fontsize=10]; 49 | c2:Out10 -> c16:In1 [label="32",fontsize=10]; 50 | c2:Out7 -> c17:In0 [label="32",fontsize=10]; 51 | c2:Out11 -> c17:In1 [label="32",fontsize=10]; 52 | } 53 | 54 | // Components: 6 add, 8 mul, 14 total. Depth: 4. 55 | -------------------------------------------------------------------------------- /dots/applyLin-v45.dot: -------------------------------------------------------------------------------- 1 | digraph { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | // ratio=1; 5 | c0 [label="{In|{|||||||||||||||||||||||}}"]; 6 | c1 [label="{{|}|×|{}}"]; 7 | c2 [label="{{|}|×|{}}"]; 8 | c3 [label="{{|}|×|{}}"]; 9 | c4 [label="{{|}|×|{}}"]; 10 | c5 [label="{{|}|+|{}}"]; 11 | c6 [label="{{|}|+|{}}"]; 12 | c7 [label="{{|}|+|{}}"]; 13 | c8 [label="{{|}|×|{}}"]; 14 | c9 [label="{{|}|×|{}}"]; 15 | c10 [label="{{|}|×|{}}"]; 16 | c11 [label="{{|}|×|{}}"]; 17 | c12 [label="{{|}|+|{}}"]; 18 | c13 [label="{{|}|+|{}}"]; 19 | c14 [label="{{|}|+|{}}"]; 20 | c15 [label="{{|}|×|{}}"]; 21 | c16 [label="{{|}|×|{}}"]; 22 | c17 [label="{{|}|×|{}}"]; 23 | c18 [label="{{|}|×|{}}"]; 24 | c19 [label="{{|}|+|{}}"]; 25 | c20 [label="{{|}|+|{}}"]; 26 | c21 [label="{{|}|+|{}}"]; 27 | c22 [label="{{|}|×|{}}"]; 28 | c23 [label="{{|}|×|{}}"]; 29 | c24 [label="{{|}|×|{}}"]; 30 | c25 [label="{{|}|×|{}}"]; 31 | c26 [label="{{|}|+|{}}"]; 32 | c27 [label="{{|}|+|{}}"]; 33 | c28 [label="{{|}|+|{}}"]; 34 | c29 [label="{{|}|×|{}}"]; 35 | c30 [label="{{|}|×|{}}"]; 36 | c31 [label="{{|}|×|{}}"]; 37 | c32 [label="{{|}|×|{}}"]; 38 | c33 [label="{{|}|+|{}}"]; 39 | c34 [label="{{|}|+|{}}"]; 40 | c35 [label="{{|}|+|{}}"]; 41 | c36 [label="{{||||}|Out}"]; 42 | c0:Out0 -> c1:In0 [label="32"]; 43 | c0:Out20 -> c1:In1 [label="32"]; 44 | c0:Out1 -> c2:In0 [label="32"]; 45 | c0:Out21 -> c2:In1 [label="32"]; 46 | c0:Out2 -> c3:In0 [label="32"]; 47 | c0:Out22 -> c3:In1 [label="32"]; 48 | c0:Out3 -> c4:In0 [label="32"]; 49 | c0:Out23 -> c4:In1 [label="32"]; 50 | c3:Out0 -> c5:In0 [label="32"]; 51 | c4:Out0 -> c5:In1 [label="32"]; 52 | c2:Out0 -> c6:In0 [label="32"]; 53 | c5:Out0 -> c6:In1 [label="32"]; 54 | c1:Out0 -> c7:In0 [label="32"]; 55 | c6:Out0 -> c7:In1 [label="32"]; 56 | c0:Out4 -> c8:In0 [label="32"]; 57 | c0:Out20 -> c8:In1 [label="32"]; 58 | c0:Out5 -> c9:In0 [label="32"]; 59 | c0:Out21 -> c9:In1 [label="32"]; 60 | c0:Out6 -> c10:In0 [label="32"]; 61 | c0:Out22 -> c10:In1 [label="32"]; 62 | c0:Out7 -> c11:In0 [label="32"]; 63 | c0:Out23 -> c11:In1 [label="32"]; 64 | c10:Out0 -> c12:In0 [label="32"]; 65 | c11:Out0 -> c12:In1 [label="32"]; 66 | c9:Out0 -> c13:In0 [label="32"]; 67 | c12:Out0 -> c13:In1 [label="32"]; 68 | c8:Out0 -> c14:In0 [label="32"]; 69 | c13:Out0 -> c14:In1 [label="32"]; 70 | c0:Out8 -> c15:In0 [label="32"]; 71 | c0:Out20 -> c15:In1 [label="32"]; 72 | c0:Out9 -> c16:In0 [label="32"]; 73 | c0:Out21 -> c16:In1 [label="32"]; 74 | c0:Out10 -> c17:In0 [label="32"]; 75 | c0:Out22 -> c17:In1 [label="32"]; 76 | c0:Out11 -> c18:In0 [label="32"]; 77 | c0:Out23 -> c18:In1 [label="32"]; 78 | c17:Out0 -> c19:In0 [label="32"]; 79 | c18:Out0 -> c19:In1 [label="32"]; 80 | c16:Out0 -> c20:In0 [label="32"]; 81 | c19:Out0 -> c20:In1 [label="32"]; 82 | c15:Out0 -> c21:In0 [label="32"]; 83 | c20:Out0 -> c21:In1 [label="32"]; 84 | c0:Out12 -> c22:In0 [label="32"]; 85 | c0:Out20 -> c22:In1 [label="32"]; 86 | c0:Out13 -> c23:In0 [label="32"]; 87 | c0:Out21 -> c23:In1 [label="32"]; 88 | c0:Out14 -> c24:In0 [label="32"]; 89 | c0:Out22 -> c24:In1 [label="32"]; 90 | c0:Out15 -> c25:In0 [label="32"]; 91 | c0:Out23 -> c25:In1 [label="32"]; 92 | c24:Out0 -> c26:In0 [label="32"]; 93 | c25:Out0 -> c26:In1 [label="32"]; 94 | c23:Out0 -> c27:In0 [label="32"]; 95 | c26:Out0 -> c27:In1 [label="32"]; 96 | c22:Out0 -> c28:In0 [label="32"]; 97 | c27:Out0 -> c28:In1 [label="32"]; 98 | c0:Out16 -> c29:In0 [label="32"]; 99 | c0:Out20 -> c29:In1 [label="32"]; 100 | c0:Out17 -> c30:In0 [label="32"]; 101 | c0:Out21 -> c30:In1 [label="32"]; 102 | c0:Out18 -> c31:In0 [label="32"]; 103 | c0:Out22 -> c31:In1 [label="32"]; 104 | c0:Out19 -> c32:In0 [label="32"]; 105 | c0:Out23 -> c32:In1 [label="32"]; 106 | c31:Out0 -> c33:In0 [label="32"]; 107 | c32:Out0 -> c33:In1 [label="32"]; 108 | c30:Out0 -> c34:In0 [label="32"]; 109 | c33:Out0 -> c34:In1 [label="32"]; 110 | c29:Out0 -> c35:In0 [label="32"]; 111 | c34:Out0 -> c35:In1 [label="32"]; 112 | c7:Out0 -> c36:In0 [label="32"]; 113 | c14:Out0 -> c36:In1 [label="32"]; 114 | c21:Out0 -> c36:In2 [label="32"]; 115 | c28:Out0 -> c36:In3 [label="32"]; 116 | c35:Out0 -> c36:In4 [label="32"]; 117 | } 118 | -------------------------------------------------------------------------------- /dots/bitonic-up-1.dot: -------------------------------------------------------------------------------- 1 | digraph bitonic_up_1 { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | bgcolor=transparent; 5 | ranksep="0.75"; 6 | c1 [label="{In|{|}}"]; 7 | c2 [label="{{|}|Out}"]; 8 | c4 [label="{{||}|if|{}}"]; 9 | c5 [label="{{||}|if|{}}"]; 10 | c6 [label="{{|}|≤|{}}"]; 11 | c4:Out0 -> c2:In0 [label=32,fontsize=10]; 12 | c5:Out0 -> c2:In1 [label=32,fontsize=10]; 13 | c6:Out0 -> c4:In0 []; 14 | c1:Out0 -> c4:In1 [label=32,fontsize=10]; 15 | c1:Out1 -> c4:In2 [label=32,fontsize=10]; 16 | c6:Out0 -> c5:In0 []; 17 | c1:Out1 -> c5:In1 [label=32,fontsize=10]; 18 | c1:Out0 -> c5:In2 [label=32,fontsize=10]; 19 | c1:Out0 -> c6:In0 [label=32,fontsize=10]; 20 | c1:Out1 -> c6:In1 [label=32,fontsize=10]; 21 | } 22 | 23 | // Components: 2 if, 1 ≤, 3 total. Max depth: 2. 24 | -------------------------------------------------------------------------------- /dots/bitonic-up-2.dot: -------------------------------------------------------------------------------- 1 | digraph bitonic_up_2 { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | bgcolor=transparent; 5 | ranksep="0.75"; 6 | c1 [label="{In|{|||}}"]; 7 | c2 [label="{{|||}|Out}"]; 8 | c4 [label="{{||}|if|{}}"]; 9 | c5 [label="{{||}|if|{}}"]; 10 | c6 [label="{{||}|if|{}}"]; 11 | c7 [label="{{||}|if|{}}"]; 12 | c8 [label="{{||}|if|{}}"]; 13 | c9 [label="{{||}|if|{}}"]; 14 | c10 [label="{{||}|if|{}}"]; 15 | c11 [label="{{||}|if|{}}"]; 16 | c12 [label="{{||}|if|{}}"]; 17 | c13 [label="{{||}|if|{}}"]; 18 | c14 [label="{{||}|if|{}}"]; 19 | c15 [label="{{||}|if|{}}"]; 20 | c17 [label="{{|}|≤|{}}"]; 21 | c18 [label="{{|}|≤|{}}"]; 22 | c19 [label="{{|}|≤|{}}"]; 23 | c20 [label="{{|}|≤|{}}"]; 24 | c21 [label="{{|}|≤|{}}"]; 25 | c22 [label="{{|}|≤|{}}"]; 26 | c12:Out0 -> c2:In0 [label=32,fontsize=10]; 27 | c13:Out0 -> c2:In1 [label=32,fontsize=10]; 28 | c14:Out0 -> c2:In2 [label=32,fontsize=10]; 29 | c15:Out0 -> c2:In3 [label=32,fontsize=10]; 30 | c17:Out0 -> c4:In0 []; 31 | c1:Out0 -> c4:In1 [label=32,fontsize=10]; 32 | c1:Out1 -> c4:In2 [label=32,fontsize=10]; 33 | c17:Out0 -> c5:In0 []; 34 | c1:Out1 -> c5:In1 [label=32,fontsize=10]; 35 | c1:Out0 -> c5:In2 [label=32,fontsize=10]; 36 | c18:Out0 -> c6:In0 []; 37 | c1:Out2 -> c6:In1 [label=32,fontsize=10]; 38 | c1:Out3 -> c6:In2 [label=32,fontsize=10]; 39 | c18:Out0 -> c7:In0 []; 40 | c1:Out3 -> c7:In1 [label=32,fontsize=10]; 41 | c1:Out2 -> c7:In2 [label=32,fontsize=10]; 42 | c19:Out0 -> c8:In0 []; 43 | c4:Out0 -> c8:In1 [label=32,fontsize=10]; 44 | c7:Out0 -> c8:In2 [label=32,fontsize=10]; 45 | c19:Out0 -> c9:In0 []; 46 | c7:Out0 -> c9:In1 [label=32,fontsize=10]; 47 | c4:Out0 -> c9:In2 [label=32,fontsize=10]; 48 | c20:Out0 -> c10:In0 []; 49 | c5:Out0 -> c10:In1 [label=32,fontsize=10]; 50 | c6:Out0 -> c10:In2 [label=32,fontsize=10]; 51 | c20:Out0 -> c11:In0 []; 52 | c6:Out0 -> c11:In1 [label=32,fontsize=10]; 53 | c5:Out0 -> c11:In2 [label=32,fontsize=10]; 54 | c21:Out0 -> c12:In0 []; 55 | c8:Out0 -> c12:In1 [label=32,fontsize=10]; 56 | c10:Out0 -> c12:In2 [label=32,fontsize=10]; 57 | c21:Out0 -> c13:In0 []; 58 | c10:Out0 -> c13:In1 [label=32,fontsize=10]; 59 | c8:Out0 -> c13:In2 [label=32,fontsize=10]; 60 | c22:Out0 -> c14:In0 []; 61 | c9:Out0 -> c14:In1 [label=32,fontsize=10]; 62 | c11:Out0 -> c14:In2 [label=32,fontsize=10]; 63 | c22:Out0 -> c15:In0 []; 64 | c11:Out0 -> c15:In1 [label=32,fontsize=10]; 65 | c9:Out0 -> c15:In2 [label=32,fontsize=10]; 66 | c1:Out0 -> c17:In0 [label=32,fontsize=10]; 67 | c1:Out1 -> c17:In1 [label=32,fontsize=10]; 68 | c1:Out2 -> c18:In0 [label=32,fontsize=10]; 69 | c1:Out3 -> c18:In1 [label=32,fontsize=10]; 70 | c4:Out0 -> c19:In0 [label=32,fontsize=10]; 71 | c7:Out0 -> c19:In1 [label=32,fontsize=10]; 72 | c5:Out0 -> c20:In0 [label=32,fontsize=10]; 73 | c6:Out0 -> c20:In1 [label=32,fontsize=10]; 74 | c8:Out0 -> c21:In0 [label=32,fontsize=10]; 75 | c10:Out0 -> c21:In1 [label=32,fontsize=10]; 76 | c9:Out0 -> c22:In0 [label=32,fontsize=10]; 77 | c11:Out0 -> c22:In1 [label=32,fontsize=10]; 78 | } 79 | 80 | // Components: 12 if, 6 ≤, 18 total. Max depth: 6. 81 | -------------------------------------------------------------------------------- /dots/bitonic-up-3.dot: -------------------------------------------------------------------------------- 1 | digraph bitonic_up_3 { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | bgcolor=transparent; 5 | ranksep="0.75"; 6 | c1 [label="{In|{|||||||}}"]; 7 | c2 [label="{{|||||||}|Out}"]; 8 | c4 [label="{{||}|if|{}}"]; 9 | c5 [label="{{||}|if|{}}"]; 10 | c6 [label="{{||}|if|{}}"]; 11 | c7 [label="{{||}|if|{}}"]; 12 | c8 [label="{{||}|if|{}}"]; 13 | c9 [label="{{||}|if|{}}"]; 14 | c10 [label="{{||}|if|{}}"]; 15 | c11 [label="{{||}|if|{}}"]; 16 | c12 [label="{{||}|if|{}}"]; 17 | c13 [label="{{||}|if|{}}"]; 18 | c14 [label="{{||}|if|{}}"]; 19 | c15 [label="{{||}|if|{}}"]; 20 | c16 [label="{{||}|if|{}}"]; 21 | c17 [label="{{||}|if|{}}"]; 22 | c18 [label="{{||}|if|{}}"]; 23 | c19 [label="{{||}|if|{}}"]; 24 | c20 [label="{{||}|if|{}}"]; 25 | c21 [label="{{||}|if|{}}"]; 26 | c22 [label="{{||}|if|{}}"]; 27 | c23 [label="{{||}|if|{}}"]; 28 | c24 [label="{{||}|if|{}}"]; 29 | c25 [label="{{||}|if|{}}"]; 30 | c26 [label="{{||}|if|{}}"]; 31 | c27 [label="{{||}|if|{}}"]; 32 | c28 [label="{{||}|if|{}}"]; 33 | c29 [label="{{||}|if|{}}"]; 34 | c30 [label="{{||}|if|{}}"]; 35 | c31 [label="{{||}|if|{}}"]; 36 | c32 [label="{{||}|if|{}}"]; 37 | c33 [label="{{||}|if|{}}"]; 38 | c34 [label="{{||}|if|{}}"]; 39 | c35 [label="{{||}|if|{}}"]; 40 | c36 [label="{{||}|if|{}}"]; 41 | c37 [label="{{||}|if|{}}"]; 42 | c38 [label="{{||}|if|{}}"]; 43 | c39 [label="{{||}|if|{}}"]; 44 | c40 [label="{{||}|if|{}}"]; 45 | c41 [label="{{||}|if|{}}"]; 46 | c42 [label="{{||}|if|{}}"]; 47 | c43 [label="{{||}|if|{}}"]; 48 | c44 [label="{{||}|if|{}}"]; 49 | c45 [label="{{||}|if|{}}"]; 50 | c46 [label="{{||}|if|{}}"]; 51 | c47 [label="{{||}|if|{}}"]; 52 | c48 [label="{{||}|if|{}}"]; 53 | c49 [label="{{||}|if|{}}"]; 54 | c50 [label="{{||}|if|{}}"]; 55 | c51 [label="{{||}|if|{}}"]; 56 | c58 [label="{{|}|≤|{}}"]; 57 | c59 [label="{{|}|≤|{}}"]; 58 | c60 [label="{{|}|≤|{}}"]; 59 | c61 [label="{{|}|≤|{}}"]; 60 | c62 [label="{{|}|≤|{}}"]; 61 | c63 [label="{{|}|≤|{}}"]; 62 | c64 [label="{{|}|≤|{}}"]; 63 | c65 [label="{{|}|≤|{}}"]; 64 | c66 [label="{{|}|≤|{}}"]; 65 | c67 [label="{{|}|≤|{}}"]; 66 | c68 [label="{{|}|≤|{}}"]; 67 | c69 [label="{{|}|≤|{}}"]; 68 | c70 [label="{{|}|≤|{}}"]; 69 | c71 [label="{{|}|≤|{}}"]; 70 | c72 [label="{{|}|≤|{}}"]; 71 | c73 [label="{{|}|≤|{}}"]; 72 | c74 [label="{{|}|≤|{}}"]; 73 | c75 [label="{{|}|≤|{}}"]; 74 | c76 [label="{{|}|≤|{}}"]; 75 | c77 [label="{{|}|≤|{}}"]; 76 | c78 [label="{{|}|≤|{}}"]; 77 | c79 [label="{{|}|≤|{}}"]; 78 | c80 [label="{{|}|≤|{}}"]; 79 | c81 [label="{{|}|≤|{}}"]; 80 | c40:Out0 -> c2:In0 [label=32,fontsize=10]; 81 | c41:Out0 -> c2:In1 [label=32,fontsize=10]; 82 | c42:Out0 -> c2:In2 [label=32,fontsize=10]; 83 | c43:Out0 -> c2:In3 [label=32,fontsize=10]; 84 | c48:Out0 -> c2:In4 [label=32,fontsize=10]; 85 | c49:Out0 -> c2:In5 [label=32,fontsize=10]; 86 | c50:Out0 -> c2:In6 [label=32,fontsize=10]; 87 | c51:Out0 -> c2:In7 [label=32,fontsize=10]; 88 | c58:Out0 -> c4:In0 []; 89 | c1:Out0 -> c4:In1 [label=32,fontsize=10]; 90 | c1:Out1 -> c4:In2 [label=32,fontsize=10]; 91 | c58:Out0 -> c5:In0 []; 92 | c1:Out1 -> c5:In1 [label=32,fontsize=10]; 93 | c1:Out0 -> c5:In2 [label=32,fontsize=10]; 94 | c59:Out0 -> c6:In0 []; 95 | c1:Out2 -> c6:In1 [label=32,fontsize=10]; 96 | c1:Out3 -> c6:In2 [label=32,fontsize=10]; 97 | c59:Out0 -> c7:In0 []; 98 | c1:Out3 -> c7:In1 [label=32,fontsize=10]; 99 | c1:Out2 -> c7:In2 [label=32,fontsize=10]; 100 | c62:Out0 -> c8:In0 []; 101 | c4:Out0 -> c8:In1 [label=32,fontsize=10]; 102 | c7:Out0 -> c8:In2 [label=32,fontsize=10]; 103 | c62:Out0 -> c9:In0 []; 104 | c7:Out0 -> c9:In1 [label=32,fontsize=10]; 105 | c4:Out0 -> c9:In2 [label=32,fontsize=10]; 106 | c63:Out0 -> c10:In0 []; 107 | c5:Out0 -> c10:In1 [label=32,fontsize=10]; 108 | c6:Out0 -> c10:In2 [label=32,fontsize=10]; 109 | c63:Out0 -> c11:In0 []; 110 | c6:Out0 -> c11:In1 [label=32,fontsize=10]; 111 | c5:Out0 -> c11:In2 [label=32,fontsize=10]; 112 | c64:Out0 -> c12:In0 []; 113 | c8:Out0 -> c12:In1 [label=32,fontsize=10]; 114 | c10:Out0 -> c12:In2 [label=32,fontsize=10]; 115 | c64:Out0 -> c13:In0 []; 116 | c10:Out0 -> c13:In1 [label=32,fontsize=10]; 117 | c8:Out0 -> c13:In2 [label=32,fontsize=10]; 118 | c65:Out0 -> c14:In0 []; 119 | c9:Out0 -> c14:In1 [label=32,fontsize=10]; 120 | c11:Out0 -> c14:In2 [label=32,fontsize=10]; 121 | c65:Out0 -> c15:In0 []; 122 | c11:Out0 -> c15:In1 [label=32,fontsize=10]; 123 | c9:Out0 -> c15:In2 [label=32,fontsize=10]; 124 | c60:Out0 -> c16:In0 []; 125 | c1:Out4 -> c16:In1 [label=32,fontsize=10]; 126 | c1:Out5 -> c16:In2 [label=32,fontsize=10]; 127 | c60:Out0 -> c17:In0 []; 128 | c1:Out5 -> c17:In1 [label=32,fontsize=10]; 129 | c1:Out4 -> c17:In2 [label=32,fontsize=10]; 130 | c61:Out0 -> c18:In0 []; 131 | c1:Out6 -> c18:In1 [label=32,fontsize=10]; 132 | c1:Out7 -> c18:In2 [label=32,fontsize=10]; 133 | c61:Out0 -> c19:In0 []; 134 | c1:Out7 -> c19:In1 [label=32,fontsize=10]; 135 | c1:Out6 -> c19:In2 [label=32,fontsize=10]; 136 | c70:Out0 -> c20:In0 []; 137 | c17:Out0 -> c20:In1 [label=32,fontsize=10]; 138 | c18:Out0 -> c20:In2 [label=32,fontsize=10]; 139 | c70:Out0 -> c21:In0 []; 140 | c18:Out0 -> c21:In1 [label=32,fontsize=10]; 141 | c17:Out0 -> c21:In2 [label=32,fontsize=10]; 142 | c71:Out0 -> c22:In0 []; 143 | c16:Out0 -> c22:In1 [label=32,fontsize=10]; 144 | c19:Out0 -> c22:In2 [label=32,fontsize=10]; 145 | c71:Out0 -> c23:In0 []; 146 | c19:Out0 -> c23:In1 [label=32,fontsize=10]; 147 | c16:Out0 -> c23:In2 [label=32,fontsize=10]; 148 | c72:Out0 -> c24:In0 []; 149 | c21:Out0 -> c24:In1 [label=32,fontsize=10]; 150 | c23:Out0 -> c24:In2 [label=32,fontsize=10]; 151 | c72:Out0 -> c25:In0 []; 152 | c23:Out0 -> c25:In1 [label=32,fontsize=10]; 153 | c21:Out0 -> c25:In2 [label=32,fontsize=10]; 154 | c73:Out0 -> c26:In0 []; 155 | c20:Out0 -> c26:In1 [label=32,fontsize=10]; 156 | c22:Out0 -> c26:In2 [label=32,fontsize=10]; 157 | c73:Out0 -> c27:In0 []; 158 | c22:Out0 -> c27:In1 [label=32,fontsize=10]; 159 | c20:Out0 -> c27:In2 [label=32,fontsize=10]; 160 | c66:Out0 -> c28:In0 []; 161 | c12:Out0 -> c28:In1 [label=32,fontsize=10]; 162 | c25:Out0 -> c28:In2 [label=32,fontsize=10]; 163 | c66:Out0 -> c29:In0 []; 164 | c25:Out0 -> c29:In1 [label=32,fontsize=10]; 165 | c12:Out0 -> c29:In2 [label=32,fontsize=10]; 166 | c67:Out0 -> c30:In0 []; 167 | c13:Out0 -> c30:In1 [label=32,fontsize=10]; 168 | c24:Out0 -> c30:In2 [label=32,fontsize=10]; 169 | c67:Out0 -> c31:In0 []; 170 | c24:Out0 -> c31:In1 [label=32,fontsize=10]; 171 | c13:Out0 -> c31:In2 [label=32,fontsize=10]; 172 | c68:Out0 -> c32:In0 []; 173 | c14:Out0 -> c32:In1 [label=32,fontsize=10]; 174 | c27:Out0 -> c32:In2 [label=32,fontsize=10]; 175 | c68:Out0 -> c33:In0 []; 176 | c27:Out0 -> c33:In1 [label=32,fontsize=10]; 177 | c14:Out0 -> c33:In2 [label=32,fontsize=10]; 178 | c69:Out0 -> c34:In0 []; 179 | c15:Out0 -> c34:In1 [label=32,fontsize=10]; 180 | c26:Out0 -> c34:In2 [label=32,fontsize=10]; 181 | c69:Out0 -> c35:In0 []; 182 | c26:Out0 -> c35:In1 [label=32,fontsize=10]; 183 | c15:Out0 -> c35:In2 [label=32,fontsize=10]; 184 | c74:Out0 -> c36:In0 []; 185 | c28:Out0 -> c36:In1 [label=32,fontsize=10]; 186 | c32:Out0 -> c36:In2 [label=32,fontsize=10]; 187 | c74:Out0 -> c37:In0 []; 188 | c32:Out0 -> c37:In1 [label=32,fontsize=10]; 189 | c28:Out0 -> c37:In2 [label=32,fontsize=10]; 190 | c76:Out0 -> c38:In0 []; 191 | c30:Out0 -> c38:In1 [label=32,fontsize=10]; 192 | c34:Out0 -> c38:In2 [label=32,fontsize=10]; 193 | c76:Out0 -> c39:In0 []; 194 | c34:Out0 -> c39:In1 [label=32,fontsize=10]; 195 | c30:Out0 -> c39:In2 [label=32,fontsize=10]; 196 | c78:Out0 -> c40:In0 []; 197 | c36:Out0 -> c40:In1 [label=32,fontsize=10]; 198 | c38:Out0 -> c40:In2 [label=32,fontsize=10]; 199 | c78:Out0 -> c41:In0 []; 200 | c38:Out0 -> c41:In1 [label=32,fontsize=10]; 201 | c36:Out0 -> c41:In2 [label=32,fontsize=10]; 202 | c79:Out0 -> c42:In0 []; 203 | c37:Out0 -> c42:In1 [label=32,fontsize=10]; 204 | c39:Out0 -> c42:In2 [label=32,fontsize=10]; 205 | c79:Out0 -> c43:In0 []; 206 | c39:Out0 -> c43:In1 [label=32,fontsize=10]; 207 | c37:Out0 -> c43:In2 [label=32,fontsize=10]; 208 | c75:Out0 -> c44:In0 []; 209 | c29:Out0 -> c44:In1 [label=32,fontsize=10]; 210 | c33:Out0 -> c44:In2 [label=32,fontsize=10]; 211 | c75:Out0 -> c45:In0 []; 212 | c33:Out0 -> c45:In1 [label=32,fontsize=10]; 213 | c29:Out0 -> c45:In2 [label=32,fontsize=10]; 214 | c77:Out0 -> c46:In0 []; 215 | c31:Out0 -> c46:In1 [label=32,fontsize=10]; 216 | c35:Out0 -> c46:In2 [label=32,fontsize=10]; 217 | c77:Out0 -> c47:In0 []; 218 | c35:Out0 -> c47:In1 [label=32,fontsize=10]; 219 | c31:Out0 -> c47:In2 [label=32,fontsize=10]; 220 | c80:Out0 -> c48:In0 []; 221 | c44:Out0 -> c48:In1 [label=32,fontsize=10]; 222 | c46:Out0 -> c48:In2 [label=32,fontsize=10]; 223 | c80:Out0 -> c49:In0 []; 224 | c46:Out0 -> c49:In1 [label=32,fontsize=10]; 225 | c44:Out0 -> c49:In2 [label=32,fontsize=10]; 226 | c81:Out0 -> c50:In0 []; 227 | c45:Out0 -> c50:In1 [label=32,fontsize=10]; 228 | c47:Out0 -> c50:In2 [label=32,fontsize=10]; 229 | c81:Out0 -> c51:In0 []; 230 | c47:Out0 -> c51:In1 [label=32,fontsize=10]; 231 | c45:Out0 -> c51:In2 [label=32,fontsize=10]; 232 | c1:Out0 -> c58:In0 [label=32,fontsize=10]; 233 | c1:Out1 -> c58:In1 [label=32,fontsize=10]; 234 | c1:Out2 -> c59:In0 [label=32,fontsize=10]; 235 | c1:Out3 -> c59:In1 [label=32,fontsize=10]; 236 | c1:Out4 -> c60:In0 [label=32,fontsize=10]; 237 | c1:Out5 -> c60:In1 [label=32,fontsize=10]; 238 | c1:Out6 -> c61:In0 [label=32,fontsize=10]; 239 | c1:Out7 -> c61:In1 [label=32,fontsize=10]; 240 | c4:Out0 -> c62:In0 [label=32,fontsize=10]; 241 | c7:Out0 -> c62:In1 [label=32,fontsize=10]; 242 | c5:Out0 -> c63:In0 [label=32,fontsize=10]; 243 | c6:Out0 -> c63:In1 [label=32,fontsize=10]; 244 | c8:Out0 -> c64:In0 [label=32,fontsize=10]; 245 | c10:Out0 -> c64:In1 [label=32,fontsize=10]; 246 | c9:Out0 -> c65:In0 [label=32,fontsize=10]; 247 | c11:Out0 -> c65:In1 [label=32,fontsize=10]; 248 | c12:Out0 -> c66:In0 [label=32,fontsize=10]; 249 | c25:Out0 -> c66:In1 [label=32,fontsize=10]; 250 | c13:Out0 -> c67:In0 [label=32,fontsize=10]; 251 | c24:Out0 -> c67:In1 [label=32,fontsize=10]; 252 | c14:Out0 -> c68:In0 [label=32,fontsize=10]; 253 | c27:Out0 -> c68:In1 [label=32,fontsize=10]; 254 | c15:Out0 -> c69:In0 [label=32,fontsize=10]; 255 | c26:Out0 -> c69:In1 [label=32,fontsize=10]; 256 | c17:Out0 -> c70:In0 [label=32,fontsize=10]; 257 | c18:Out0 -> c70:In1 [label=32,fontsize=10]; 258 | c16:Out0 -> c71:In0 [label=32,fontsize=10]; 259 | c19:Out0 -> c71:In1 [label=32,fontsize=10]; 260 | c21:Out0 -> c72:In0 [label=32,fontsize=10]; 261 | c23:Out0 -> c72:In1 [label=32,fontsize=10]; 262 | c20:Out0 -> c73:In0 [label=32,fontsize=10]; 263 | c22:Out0 -> c73:In1 [label=32,fontsize=10]; 264 | c28:Out0 -> c74:In0 [label=32,fontsize=10]; 265 | c32:Out0 -> c74:In1 [label=32,fontsize=10]; 266 | c29:Out0 -> c75:In0 [label=32,fontsize=10]; 267 | c33:Out0 -> c75:In1 [label=32,fontsize=10]; 268 | c30:Out0 -> c76:In0 [label=32,fontsize=10]; 269 | c34:Out0 -> c76:In1 [label=32,fontsize=10]; 270 | c31:Out0 -> c77:In0 [label=32,fontsize=10]; 271 | c35:Out0 -> c77:In1 [label=32,fontsize=10]; 272 | c36:Out0 -> c78:In0 [label=32,fontsize=10]; 273 | c38:Out0 -> c78:In1 [label=32,fontsize=10]; 274 | c37:Out0 -> c79:In0 [label=32,fontsize=10]; 275 | c39:Out0 -> c79:In1 [label=32,fontsize=10]; 276 | c44:Out0 -> c80:In0 [label=32,fontsize=10]; 277 | c46:Out0 -> c80:In1 [label=32,fontsize=10]; 278 | c45:Out0 -> c81:In0 [label=32,fontsize=10]; 279 | c47:Out0 -> c81:In1 [label=32,fontsize=10]; 280 | } 281 | 282 | // Components: 48 if, 24 ≤, 72 total. Max depth: 12. 283 | -------------------------------------------------------------------------------- /dots/composeLin-t222.dot: -------------------------------------------------------------------------------- 1 | digraph { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | // ratio=1; 5 | ranksep=7; 6 | c0 [label="{In|{|||||||||||||||||||||||||||||||}}"]; 7 | c1 [label="{{|}|×|{}}"]; 8 | c2 [label="{{|}|×|{}}"]; 9 | c3 [label="{{|}|×|{}}"]; 10 | c4 [label="{{|}|×|{}}"]; 11 | c5 [label="{{|}|+|{}}"]; 12 | c6 [label="{{|}|+|{}}"]; 13 | c7 [label="{{|}|+|{}}"]; 14 | c8 [label="{{|}|×|{}}"]; 15 | c9 [label="{{|}|×|{}}"]; 16 | c10 [label="{{|}|×|{}}"]; 17 | c11 [label="{{|}|×|{}}"]; 18 | c12 [label="{{|}|+|{}}"]; 19 | c13 [label="{{|}|+|{}}"]; 20 | c14 [label="{{|}|+|{}}"]; 21 | c15 [label="{{|}|×|{}}"]; 22 | c16 [label="{{|}|×|{}}"]; 23 | c17 [label="{{|}|×|{}}"]; 24 | c18 [label="{{|}|×|{}}"]; 25 | c19 [label="{{|}|+|{}}"]; 26 | c20 [label="{{|}|+|{}}"]; 27 | c21 [label="{{|}|+|{}}"]; 28 | c22 [label="{{|}|×|{}}"]; 29 | c23 [label="{{|}|×|{}}"]; 30 | c24 [label="{{|}|×|{}}"]; 31 | c25 [label="{{|}|×|{}}"]; 32 | c26 [label="{{|}|+|{}}"]; 33 | c27 [label="{{|}|+|{}}"]; 34 | c28 [label="{{|}|+|{}}"]; 35 | c29 [label="{{|}|×|{}}"]; 36 | c30 [label="{{|}|×|{}}"]; 37 | c31 [label="{{|}|×|{}}"]; 38 | c32 [label="{{|}|×|{}}"]; 39 | c33 [label="{{|}|+|{}}"]; 40 | c34 [label="{{|}|+|{}}"]; 41 | c35 [label="{{|}|+|{}}"]; 42 | c36 [label="{{|}|×|{}}"]; 43 | c37 [label="{{|}|×|{}}"]; 44 | c38 [label="{{|}|×|{}}"]; 45 | c39 [label="{{|}|×|{}}"]; 46 | c40 [label="{{|}|+|{}}"]; 47 | c41 [label="{{|}|+|{}}"]; 48 | c42 [label="{{|}|+|{}}"]; 49 | c43 [label="{{|}|×|{}}"]; 50 | c44 [label="{{|}|×|{}}"]; 51 | c45 [label="{{|}|×|{}}"]; 52 | c46 [label="{{|}|×|{}}"]; 53 | c47 [label="{{|}|+|{}}"]; 54 | c48 [label="{{|}|+|{}}"]; 55 | c49 [label="{{|}|+|{}}"]; 56 | c50 [label="{{|}|×|{}}"]; 57 | c51 [label="{{|}|×|{}}"]; 58 | c52 [label="{{|}|×|{}}"]; 59 | c53 [label="{{|}|×|{}}"]; 60 | c54 [label="{{|}|+|{}}"]; 61 | c55 [label="{{|}|+|{}}"]; 62 | c56 [label="{{|}|+|{}}"]; 63 | c57 [label="{{|}|×|{}}"]; 64 | c58 [label="{{|}|×|{}}"]; 65 | c59 [label="{{|}|×|{}}"]; 66 | c60 [label="{{|}|×|{}}"]; 67 | c61 [label="{{|}|+|{}}"]; 68 | c62 [label="{{|}|+|{}}"]; 69 | c63 [label="{{|}|+|{}}"]; 70 | c64 [label="{{|}|×|{}}"]; 71 | c65 [label="{{|}|×|{}}"]; 72 | c66 [label="{{|}|×|{}}"]; 73 | c67 [label="{{|}|×|{}}"]; 74 | c68 [label="{{|}|+|{}}"]; 75 | c69 [label="{{|}|+|{}}"]; 76 | c70 [label="{{|}|+|{}}"]; 77 | c71 [label="{{|}|×|{}}"]; 78 | c72 [label="{{|}|×|{}}"]; 79 | c73 [label="{{|}|×|{}}"]; 80 | c74 [label="{{|}|×|{}}"]; 81 | c75 [label="{{|}|+|{}}"]; 82 | c76 [label="{{|}|+|{}}"]; 83 | c77 [label="{{|}|+|{}}"]; 84 | c78 [label="{{|}|×|{}}"]; 85 | c79 [label="{{|}|×|{}}"]; 86 | c80 [label="{{|}|×|{}}"]; 87 | c81 [label="{{|}|×|{}}"]; 88 | c82 [label="{{|}|+|{}}"]; 89 | c83 [label="{{|}|+|{}}"]; 90 | c84 [label="{{|}|+|{}}"]; 91 | c85 [label="{{|}|×|{}}"]; 92 | c86 [label="{{|}|×|{}}"]; 93 | c87 [label="{{|}|×|{}}"]; 94 | c88 [label="{{|}|×|{}}"]; 95 | c89 [label="{{|}|+|{}}"]; 96 | c90 [label="{{|}|+|{}}"]; 97 | c91 [label="{{|}|+|{}}"]; 98 | c92 [label="{{|}|×|{}}"]; 99 | c93 [label="{{|}|×|{}}"]; 100 | c94 [label="{{|}|×|{}}"]; 101 | c95 [label="{{|}|×|{}}"]; 102 | c96 [label="{{|}|+|{}}"]; 103 | c97 [label="{{|}|+|{}}"]; 104 | c98 [label="{{|}|+|{}}"]; 105 | c99 [label="{{|}|×|{}}"]; 106 | c100 [label="{{|}|×|{}}"]; 107 | c101 [label="{{|}|×|{}}"]; 108 | c102 [label="{{|}|×|{}}"]; 109 | c103 [label="{{|}|+|{}}"]; 110 | c104 [label="{{|}|+|{}}"]; 111 | c105 [label="{{|}|+|{}}"]; 112 | c106 [label="{{|}|×|{}}"]; 113 | c107 [label="{{|}|×|{}}"]; 114 | c108 [label="{{|}|×|{}}"]; 115 | c109 [label="{{|}|×|{}}"]; 116 | c110 [label="{{|}|+|{}}"]; 117 | c111 [label="{{|}|+|{}}"]; 118 | c112 [label="{{|}|+|{}}"]; 119 | c113 [label="{{|||||||||||||||}|Out}"]; 120 | c0:Out0 -> c1:In0 [label="32"]; 121 | c0:Out16 -> c1:In1 [label="32"]; 122 | c0:Out1 -> c2:In0 [label="32"]; 123 | c0:Out20 -> c2:In1 [label="32"]; 124 | c0:Out2 -> c3:In0 [label="32"]; 125 | c0:Out24 -> c3:In1 [label="32"]; 126 | c0:Out3 -> c4:In0 [label="32"]; 127 | c0:Out28 -> c4:In1 [label="32"]; 128 | c1:Out0 -> c5:In0 [label="32"]; 129 | c2:Out0 -> c5:In1 [label="32"]; 130 | c3:Out0 -> c6:In0 [label="32"]; 131 | c4:Out0 -> c6:In1 [label="32"]; 132 | c5:Out0 -> c7:In0 [label="32"]; 133 | c6:Out0 -> c7:In1 [label="32"]; 134 | c0:Out4 -> c8:In0 [label="32"]; 135 | c0:Out16 -> c8:In1 [label="32"]; 136 | c0:Out5 -> c9:In0 [label="32"]; 137 | c0:Out20 -> c9:In1 [label="32"]; 138 | c0:Out6 -> c10:In0 [label="32"]; 139 | c0:Out24 -> c10:In1 [label="32"]; 140 | c0:Out7 -> c11:In0 [label="32"]; 141 | c0:Out28 -> c11:In1 [label="32"]; 142 | c8:Out0 -> c12:In0 [label="32"]; 143 | c9:Out0 -> c12:In1 [label="32"]; 144 | c10:Out0 -> c13:In0 [label="32"]; 145 | c11:Out0 -> c13:In1 [label="32"]; 146 | c12:Out0 -> c14:In0 [label="32"]; 147 | c13:Out0 -> c14:In1 [label="32"]; 148 | c0:Out8 -> c15:In0 [label="32"]; 149 | c0:Out16 -> c15:In1 [label="32"]; 150 | c0:Out9 -> c16:In0 [label="32"]; 151 | c0:Out20 -> c16:In1 [label="32"]; 152 | c0:Out10 -> c17:In0 [label="32"]; 153 | c0:Out24 -> c17:In1 [label="32"]; 154 | c0:Out11 -> c18:In0 [label="32"]; 155 | c0:Out28 -> c18:In1 [label="32"]; 156 | c15:Out0 -> c19:In0 [label="32"]; 157 | c16:Out0 -> c19:In1 [label="32"]; 158 | c17:Out0 -> c20:In0 [label="32"]; 159 | c18:Out0 -> c20:In1 [label="32"]; 160 | c19:Out0 -> c21:In0 [label="32"]; 161 | c20:Out0 -> c21:In1 [label="32"]; 162 | c0:Out12 -> c22:In0 [label="32"]; 163 | c0:Out16 -> c22:In1 [label="32"]; 164 | c0:Out13 -> c23:In0 [label="32"]; 165 | c0:Out20 -> c23:In1 [label="32"]; 166 | c0:Out14 -> c24:In0 [label="32"]; 167 | c0:Out24 -> c24:In1 [label="32"]; 168 | c0:Out15 -> c25:In0 [label="32"]; 169 | c0:Out28 -> c25:In1 [label="32"]; 170 | c22:Out0 -> c26:In0 [label="32"]; 171 | c23:Out0 -> c26:In1 [label="32"]; 172 | c24:Out0 -> c27:In0 [label="32"]; 173 | c25:Out0 -> c27:In1 [label="32"]; 174 | c26:Out0 -> c28:In0 [label="32"]; 175 | c27:Out0 -> c28:In1 [label="32"]; 176 | c0:Out0 -> c29:In0 [label="32"]; 177 | c0:Out17 -> c29:In1 [label="32"]; 178 | c0:Out1 -> c30:In0 [label="32"]; 179 | c0:Out21 -> c30:In1 [label="32"]; 180 | c0:Out2 -> c31:In0 [label="32"]; 181 | c0:Out25 -> c31:In1 [label="32"]; 182 | c0:Out3 -> c32:In0 [label="32"]; 183 | c0:Out29 -> c32:In1 [label="32"]; 184 | c29:Out0 -> c33:In0 [label="32"]; 185 | c30:Out0 -> c33:In1 [label="32"]; 186 | c31:Out0 -> c34:In0 [label="32"]; 187 | c32:Out0 -> c34:In1 [label="32"]; 188 | c33:Out0 -> c35:In0 [label="32"]; 189 | c34:Out0 -> c35:In1 [label="32"]; 190 | c0:Out4 -> c36:In0 [label="32"]; 191 | c0:Out17 -> c36:In1 [label="32"]; 192 | c0:Out5 -> c37:In0 [label="32"]; 193 | c0:Out21 -> c37:In1 [label="32"]; 194 | c0:Out6 -> c38:In0 [label="32"]; 195 | c0:Out25 -> c38:In1 [label="32"]; 196 | c0:Out7 -> c39:In0 [label="32"]; 197 | c0:Out29 -> c39:In1 [label="32"]; 198 | c36:Out0 -> c40:In0 [label="32"]; 199 | c37:Out0 -> c40:In1 [label="32"]; 200 | c38:Out0 -> c41:In0 [label="32"]; 201 | c39:Out0 -> c41:In1 [label="32"]; 202 | c40:Out0 -> c42:In0 [label="32"]; 203 | c41:Out0 -> c42:In1 [label="32"]; 204 | c0:Out8 -> c43:In0 [label="32"]; 205 | c0:Out17 -> c43:In1 [label="32"]; 206 | c0:Out9 -> c44:In0 [label="32"]; 207 | c0:Out21 -> c44:In1 [label="32"]; 208 | c0:Out10 -> c45:In0 [label="32"]; 209 | c0:Out25 -> c45:In1 [label="32"]; 210 | c0:Out11 -> c46:In0 [label="32"]; 211 | c0:Out29 -> c46:In1 [label="32"]; 212 | c43:Out0 -> c47:In0 [label="32"]; 213 | c44:Out0 -> c47:In1 [label="32"]; 214 | c45:Out0 -> c48:In0 [label="32"]; 215 | c46:Out0 -> c48:In1 [label="32"]; 216 | c47:Out0 -> c49:In0 [label="32"]; 217 | c48:Out0 -> c49:In1 [label="32"]; 218 | c0:Out12 -> c50:In0 [label="32"]; 219 | c0:Out17 -> c50:In1 [label="32"]; 220 | c0:Out13 -> c51:In0 [label="32"]; 221 | c0:Out21 -> c51:In1 [label="32"]; 222 | c0:Out14 -> c52:In0 [label="32"]; 223 | c0:Out25 -> c52:In1 [label="32"]; 224 | c0:Out15 -> c53:In0 [label="32"]; 225 | c0:Out29 -> c53:In1 [label="32"]; 226 | c50:Out0 -> c54:In0 [label="32"]; 227 | c51:Out0 -> c54:In1 [label="32"]; 228 | c52:Out0 -> c55:In0 [label="32"]; 229 | c53:Out0 -> c55:In1 [label="32"]; 230 | c54:Out0 -> c56:In0 [label="32"]; 231 | c55:Out0 -> c56:In1 [label="32"]; 232 | c0:Out0 -> c57:In0 [label="32"]; 233 | c0:Out18 -> c57:In1 [label="32"]; 234 | c0:Out1 -> c58:In0 [label="32"]; 235 | c0:Out22 -> c58:In1 [label="32"]; 236 | c0:Out2 -> c59:In0 [label="32"]; 237 | c0:Out26 -> c59:In1 [label="32"]; 238 | c0:Out3 -> c60:In0 [label="32"]; 239 | c0:Out30 -> c60:In1 [label="32"]; 240 | c57:Out0 -> c61:In0 [label="32"]; 241 | c58:Out0 -> c61:In1 [label="32"]; 242 | c59:Out0 -> c62:In0 [label="32"]; 243 | c60:Out0 -> c62:In1 [label="32"]; 244 | c61:Out0 -> c63:In0 [label="32"]; 245 | c62:Out0 -> c63:In1 [label="32"]; 246 | c0:Out4 -> c64:In0 [label="32"]; 247 | c0:Out18 -> c64:In1 [label="32"]; 248 | c0:Out5 -> c65:In0 [label="32"]; 249 | c0:Out22 -> c65:In1 [label="32"]; 250 | c0:Out6 -> c66:In0 [label="32"]; 251 | c0:Out26 -> c66:In1 [label="32"]; 252 | c0:Out7 -> c67:In0 [label="32"]; 253 | c0:Out30 -> c67:In1 [label="32"]; 254 | c64:Out0 -> c68:In0 [label="32"]; 255 | c65:Out0 -> c68:In1 [label="32"]; 256 | c66:Out0 -> c69:In0 [label="32"]; 257 | c67:Out0 -> c69:In1 [label="32"]; 258 | c68:Out0 -> c70:In0 [label="32"]; 259 | c69:Out0 -> c70:In1 [label="32"]; 260 | c0:Out8 -> c71:In0 [label="32"]; 261 | c0:Out18 -> c71:In1 [label="32"]; 262 | c0:Out9 -> c72:In0 [label="32"]; 263 | c0:Out22 -> c72:In1 [label="32"]; 264 | c0:Out10 -> c73:In0 [label="32"]; 265 | c0:Out26 -> c73:In1 [label="32"]; 266 | c0:Out11 -> c74:In0 [label="32"]; 267 | c0:Out30 -> c74:In1 [label="32"]; 268 | c71:Out0 -> c75:In0 [label="32"]; 269 | c72:Out0 -> c75:In1 [label="32"]; 270 | c73:Out0 -> c76:In0 [label="32"]; 271 | c74:Out0 -> c76:In1 [label="32"]; 272 | c75:Out0 -> c77:In0 [label="32"]; 273 | c76:Out0 -> c77:In1 [label="32"]; 274 | c0:Out12 -> c78:In0 [label="32"]; 275 | c0:Out18 -> c78:In1 [label="32"]; 276 | c0:Out13 -> c79:In0 [label="32"]; 277 | c0:Out22 -> c79:In1 [label="32"]; 278 | c0:Out14 -> c80:In0 [label="32"]; 279 | c0:Out26 -> c80:In1 [label="32"]; 280 | c0:Out15 -> c81:In0 [label="32"]; 281 | c0:Out30 -> c81:In1 [label="32"]; 282 | c78:Out0 -> c82:In0 [label="32"]; 283 | c79:Out0 -> c82:In1 [label="32"]; 284 | c80:Out0 -> c83:In0 [label="32"]; 285 | c81:Out0 -> c83:In1 [label="32"]; 286 | c82:Out0 -> c84:In0 [label="32"]; 287 | c83:Out0 -> c84:In1 [label="32"]; 288 | c0:Out0 -> c85:In0 [label="32"]; 289 | c0:Out19 -> c85:In1 [label="32"]; 290 | c0:Out1 -> c86:In0 [label="32"]; 291 | c0:Out23 -> c86:In1 [label="32"]; 292 | c0:Out2 -> c87:In0 [label="32"]; 293 | c0:Out27 -> c87:In1 [label="32"]; 294 | c0:Out3 -> c88:In0 [label="32"]; 295 | c0:Out31 -> c88:In1 [label="32"]; 296 | c85:Out0 -> c89:In0 [label="32"]; 297 | c86:Out0 -> c89:In1 [label="32"]; 298 | c87:Out0 -> c90:In0 [label="32"]; 299 | c88:Out0 -> c90:In1 [label="32"]; 300 | c89:Out0 -> c91:In0 [label="32"]; 301 | c90:Out0 -> c91:In1 [label="32"]; 302 | c0:Out4 -> c92:In0 [label="32"]; 303 | c0:Out19 -> c92:In1 [label="32"]; 304 | c0:Out5 -> c93:In0 [label="32"]; 305 | c0:Out23 -> c93:In1 [label="32"]; 306 | c0:Out6 -> c94:In0 [label="32"]; 307 | c0:Out27 -> c94:In1 [label="32"]; 308 | c0:Out7 -> c95:In0 [label="32"]; 309 | c0:Out31 -> c95:In1 [label="32"]; 310 | c92:Out0 -> c96:In0 [label="32"]; 311 | c93:Out0 -> c96:In1 [label="32"]; 312 | c94:Out0 -> c97:In0 [label="32"]; 313 | c95:Out0 -> c97:In1 [label="32"]; 314 | c96:Out0 -> c98:In0 [label="32"]; 315 | c97:Out0 -> c98:In1 [label="32"]; 316 | c0:Out8 -> c99:In0 [label="32"]; 317 | c0:Out19 -> c99:In1 [label="32"]; 318 | c0:Out9 -> c100:In0 [label="32"]; 319 | c0:Out23 -> c100:In1 [label="32"]; 320 | c0:Out10 -> c101:In0 [label="32"]; 321 | c0:Out27 -> c101:In1 [label="32"]; 322 | c0:Out11 -> c102:In0 [label="32"]; 323 | c0:Out31 -> c102:In1 [label="32"]; 324 | c99:Out0 -> c103:In0 [label="32"]; 325 | c100:Out0 -> c103:In1 [label="32"]; 326 | c101:Out0 -> c104:In0 [label="32"]; 327 | c102:Out0 -> c104:In1 [label="32"]; 328 | c103:Out0 -> c105:In0 [label="32"]; 329 | c104:Out0 -> c105:In1 [label="32"]; 330 | c0:Out12 -> c106:In0 [label="32"]; 331 | c0:Out19 -> c106:In1 [label="32"]; 332 | c0:Out13 -> c107:In0 [label="32"]; 333 | c0:Out23 -> c107:In1 [label="32"]; 334 | c0:Out14 -> c108:In0 [label="32"]; 335 | c0:Out27 -> c108:In1 [label="32"]; 336 | c0:Out15 -> c109:In0 [label="32"]; 337 | c0:Out31 -> c109:In1 [label="32"]; 338 | c106:Out0 -> c110:In0 [label="32"]; 339 | c107:Out0 -> c110:In1 [label="32"]; 340 | c108:Out0 -> c111:In0 [label="32"]; 341 | c109:Out0 -> c111:In1 [label="32"]; 342 | c110:Out0 -> c112:In0 [label="32"]; 343 | c111:Out0 -> c112:In1 [label="32"]; 344 | c7:Out0 -> c113:In0 [label="32"]; 345 | c35:Out0 -> c113:In1 [label="32"]; 346 | c63:Out0 -> c113:In2 [label="32"]; 347 | c91:Out0 -> c113:In3 [label="32"]; 348 | c14:Out0 -> c113:In4 [label="32"]; 349 | c42:Out0 -> c113:In5 [label="32"]; 350 | c70:Out0 -> c113:In6 [label="32"]; 351 | c98:Out0 -> c113:In7 [label="32"]; 352 | c21:Out0 -> c113:In8 [label="32"]; 353 | c49:Out0 -> c113:In9 [label="32"]; 354 | c77:Out0 -> c113:In10 [label="32"]; 355 | c105:Out0 -> c113:In11 [label="32"]; 356 | c28:Out0 -> c113:In12 [label="32"]; 357 | c56:Out0 -> c113:In13 [label="32"]; 358 | c84:Out0 -> c113:In14 [label="32"]; 359 | c112:Out0 -> c113:In15 [label="32"]; 360 | } 361 | -------------------------------------------------------------------------------- /dots/composeLin-t232.dot: -------------------------------------------------------------------------------- 1 | digraph { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | // ratio=1; 5 | ranksep=10; 6 | c0 [label="{In|{|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||}}"]; 7 | c1 [label="{{|}|×|{}}"]; 8 | c2 [label="{{|}|×|{}}"]; 9 | c3 [label="{{|}|×|{}}"]; 10 | c4 [label="{{|}|×|{}}"]; 11 | c5 [label="{{|}|×|{}}"]; 12 | c6 [label="{{|}|×|{}}"]; 13 | c7 [label="{{|}|×|{}}"]; 14 | c8 [label="{{|}|×|{}}"]; 15 | c9 [label="{{|}|+|{}}"]; 16 | c10 [label="{{|}|+|{}}"]; 17 | c11 [label="{{|}|+|{}}"]; 18 | c12 [label="{{|}|+|{}}"]; 19 | c13 [label="{{|}|+|{}}"]; 20 | c14 [label="{{|}|+|{}}"]; 21 | c15 [label="{{|}|+|{}}"]; 22 | c16 [label="{{|}|×|{}}"]; 23 | c17 [label="{{|}|×|{}}"]; 24 | c18 [label="{{|}|×|{}}"]; 25 | c19 [label="{{|}|×|{}}"]; 26 | c20 [label="{{|}|×|{}}"]; 27 | c21 [label="{{|}|×|{}}"]; 28 | c22 [label="{{|}|×|{}}"]; 29 | c23 [label="{{|}|×|{}}"]; 30 | c24 [label="{{|}|+|{}}"]; 31 | c25 [label="{{|}|+|{}}"]; 32 | c26 [label="{{|}|+|{}}"]; 33 | c27 [label="{{|}|+|{}}"]; 34 | c28 [label="{{|}|+|{}}"]; 35 | c29 [label="{{|}|+|{}}"]; 36 | c30 [label="{{|}|+|{}}"]; 37 | c31 [label="{{|}|×|{}}"]; 38 | c32 [label="{{|}|×|{}}"]; 39 | c33 [label="{{|}|×|{}}"]; 40 | c34 [label="{{|}|×|{}}"]; 41 | c35 [label="{{|}|×|{}}"]; 42 | c36 [label="{{|}|×|{}}"]; 43 | c37 [label="{{|}|×|{}}"]; 44 | c38 [label="{{|}|×|{}}"]; 45 | c39 [label="{{|}|+|{}}"]; 46 | c40 [label="{{|}|+|{}}"]; 47 | c41 [label="{{|}|+|{}}"]; 48 | c42 [label="{{|}|+|{}}"]; 49 | c43 [label="{{|}|+|{}}"]; 50 | c44 [label="{{|}|+|{}}"]; 51 | c45 [label="{{|}|+|{}}"]; 52 | c46 [label="{{|}|×|{}}"]; 53 | c47 [label="{{|}|×|{}}"]; 54 | c48 [label="{{|}|×|{}}"]; 55 | c49 [label="{{|}|×|{}}"]; 56 | c50 [label="{{|}|×|{}}"]; 57 | c51 [label="{{|}|×|{}}"]; 58 | c52 [label="{{|}|×|{}}"]; 59 | c53 [label="{{|}|×|{}}"]; 60 | c54 [label="{{|}|+|{}}"]; 61 | c55 [label="{{|}|+|{}}"]; 62 | c56 [label="{{|}|+|{}}"]; 63 | c57 [label="{{|}|+|{}}"]; 64 | c58 [label="{{|}|+|{}}"]; 65 | c59 [label="{{|}|+|{}}"]; 66 | c60 [label="{{|}|+|{}}"]; 67 | c61 [label="{{|}|×|{}}"]; 68 | c62 [label="{{|}|×|{}}"]; 69 | c63 [label="{{|}|×|{}}"]; 70 | c64 [label="{{|}|×|{}}"]; 71 | c65 [label="{{|}|×|{}}"]; 72 | c66 [label="{{|}|×|{}}"]; 73 | c67 [label="{{|}|×|{}}"]; 74 | c68 [label="{{|}|×|{}}"]; 75 | c69 [label="{{|}|+|{}}"]; 76 | c70 [label="{{|}|+|{}}"]; 77 | c71 [label="{{|}|+|{}}"]; 78 | c72 [label="{{|}|+|{}}"]; 79 | c73 [label="{{|}|+|{}}"]; 80 | c74 [label="{{|}|+|{}}"]; 81 | c75 [label="{{|}|+|{}}"]; 82 | c76 [label="{{|}|×|{}}"]; 83 | c77 [label="{{|}|×|{}}"]; 84 | c78 [label="{{|}|×|{}}"]; 85 | c79 [label="{{|}|×|{}}"]; 86 | c80 [label="{{|}|×|{}}"]; 87 | c81 [label="{{|}|×|{}}"]; 88 | c82 [label="{{|}|×|{}}"]; 89 | c83 [label="{{|}|×|{}}"]; 90 | c84 [label="{{|}|+|{}}"]; 91 | c85 [label="{{|}|+|{}}"]; 92 | c86 [label="{{|}|+|{}}"]; 93 | c87 [label="{{|}|+|{}}"]; 94 | c88 [label="{{|}|+|{}}"]; 95 | c89 [label="{{|}|+|{}}"]; 96 | c90 [label="{{|}|+|{}}"]; 97 | c91 [label="{{|}|×|{}}"]; 98 | c92 [label="{{|}|×|{}}"]; 99 | c93 [label="{{|}|×|{}}"]; 100 | c94 [label="{{|}|×|{}}"]; 101 | c95 [label="{{|}|×|{}}"]; 102 | c96 [label="{{|}|×|{}}"]; 103 | c97 [label="{{|}|×|{}}"]; 104 | c98 [label="{{|}|×|{}}"]; 105 | c99 [label="{{|}|+|{}}"]; 106 | c100 [label="{{|}|+|{}}"]; 107 | c101 [label="{{|}|+|{}}"]; 108 | c102 [label="{{|}|+|{}}"]; 109 | c103 [label="{{|}|+|{}}"]; 110 | c104 [label="{{|}|+|{}}"]; 111 | c105 [label="{{|}|+|{}}"]; 112 | c106 [label="{{|}|×|{}}"]; 113 | c107 [label="{{|}|×|{}}"]; 114 | c108 [label="{{|}|×|{}}"]; 115 | c109 [label="{{|}|×|{}}"]; 116 | c110 [label="{{|}|×|{}}"]; 117 | c111 [label="{{|}|×|{}}"]; 118 | c112 [label="{{|}|×|{}}"]; 119 | c113 [label="{{|}|×|{}}"]; 120 | c114 [label="{{|}|+|{}}"]; 121 | c115 [label="{{|}|+|{}}"]; 122 | c116 [label="{{|}|+|{}}"]; 123 | c117 [label="{{|}|+|{}}"]; 124 | c118 [label="{{|}|+|{}}"]; 125 | c119 [label="{{|}|+|{}}"]; 126 | c120 [label="{{|}|+|{}}"]; 127 | c121 [label="{{|}|×|{}}"]; 128 | c122 [label="{{|}|×|{}}"]; 129 | c123 [label="{{|}|×|{}}"]; 130 | c124 [label="{{|}|×|{}}"]; 131 | c125 [label="{{|}|×|{}}"]; 132 | c126 [label="{{|}|×|{}}"]; 133 | c127 [label="{{|}|×|{}}"]; 134 | c128 [label="{{|}|×|{}}"]; 135 | c129 [label="{{|}|+|{}}"]; 136 | c130 [label="{{|}|+|{}}"]; 137 | c131 [label="{{|}|+|{}}"]; 138 | c132 [label="{{|}|+|{}}"]; 139 | c133 [label="{{|}|+|{}}"]; 140 | c134 [label="{{|}|+|{}}"]; 141 | c135 [label="{{|}|+|{}}"]; 142 | c136 [label="{{|}|×|{}}"]; 143 | c137 [label="{{|}|×|{}}"]; 144 | c138 [label="{{|}|×|{}}"]; 145 | c139 [label="{{|}|×|{}}"]; 146 | c140 [label="{{|}|×|{}}"]; 147 | c141 [label="{{|}|×|{}}"]; 148 | c142 [label="{{|}|×|{}}"]; 149 | c143 [label="{{|}|×|{}}"]; 150 | c144 [label="{{|}|+|{}}"]; 151 | c145 [label="{{|}|+|{}}"]; 152 | c146 [label="{{|}|+|{}}"]; 153 | c147 [label="{{|}|+|{}}"]; 154 | c148 [label="{{|}|+|{}}"]; 155 | c149 [label="{{|}|+|{}}"]; 156 | c150 [label="{{|}|+|{}}"]; 157 | c151 [label="{{|}|×|{}}"]; 158 | c152 [label="{{|}|×|{}}"]; 159 | c153 [label="{{|}|×|{}}"]; 160 | c154 [label="{{|}|×|{}}"]; 161 | c155 [label="{{|}|×|{}}"]; 162 | c156 [label="{{|}|×|{}}"]; 163 | c157 [label="{{|}|×|{}}"]; 164 | c158 [label="{{|}|×|{}}"]; 165 | c159 [label="{{|}|+|{}}"]; 166 | c160 [label="{{|}|+|{}}"]; 167 | c161 [label="{{|}|+|{}}"]; 168 | c162 [label="{{|}|+|{}}"]; 169 | c163 [label="{{|}|+|{}}"]; 170 | c164 [label="{{|}|+|{}}"]; 171 | c165 [label="{{|}|+|{}}"]; 172 | c166 [label="{{|}|×|{}}"]; 173 | c167 [label="{{|}|×|{}}"]; 174 | c168 [label="{{|}|×|{}}"]; 175 | c169 [label="{{|}|×|{}}"]; 176 | c170 [label="{{|}|×|{}}"]; 177 | c171 [label="{{|}|×|{}}"]; 178 | c172 [label="{{|}|×|{}}"]; 179 | c173 [label="{{|}|×|{}}"]; 180 | c174 [label="{{|}|+|{}}"]; 181 | c175 [label="{{|}|+|{}}"]; 182 | c176 [label="{{|}|+|{}}"]; 183 | c177 [label="{{|}|+|{}}"]; 184 | c178 [label="{{|}|+|{}}"]; 185 | c179 [label="{{|}|+|{}}"]; 186 | c180 [label="{{|}|+|{}}"]; 187 | c181 [label="{{|}|×|{}}"]; 188 | c182 [label="{{|}|×|{}}"]; 189 | c183 [label="{{|}|×|{}}"]; 190 | c184 [label="{{|}|×|{}}"]; 191 | c185 [label="{{|}|×|{}}"]; 192 | c186 [label="{{|}|×|{}}"]; 193 | c187 [label="{{|}|×|{}}"]; 194 | c188 [label="{{|}|×|{}}"]; 195 | c189 [label="{{|}|+|{}}"]; 196 | c190 [label="{{|}|+|{}}"]; 197 | c191 [label="{{|}|+|{}}"]; 198 | c192 [label="{{|}|+|{}}"]; 199 | c193 [label="{{|}|+|{}}"]; 200 | c194 [label="{{|}|+|{}}"]; 201 | c195 [label="{{|}|+|{}}"]; 202 | c196 [label="{{|}|×|{}}"]; 203 | c197 [label="{{|}|×|{}}"]; 204 | c198 [label="{{|}|×|{}}"]; 205 | c199 [label="{{|}|×|{}}"]; 206 | c200 [label="{{|}|×|{}}"]; 207 | c201 [label="{{|}|×|{}}"]; 208 | c202 [label="{{|}|×|{}}"]; 209 | c203 [label="{{|}|×|{}}"]; 210 | c204 [label="{{|}|+|{}}"]; 211 | c205 [label="{{|}|+|{}}"]; 212 | c206 [label="{{|}|+|{}}"]; 213 | c207 [label="{{|}|+|{}}"]; 214 | c208 [label="{{|}|+|{}}"]; 215 | c209 [label="{{|}|+|{}}"]; 216 | c210 [label="{{|}|+|{}}"]; 217 | c211 [label="{{|}|×|{}}"]; 218 | c212 [label="{{|}|×|{}}"]; 219 | c213 [label="{{|}|×|{}}"]; 220 | c214 [label="{{|}|×|{}}"]; 221 | c215 [label="{{|}|×|{}}"]; 222 | c216 [label="{{|}|×|{}}"]; 223 | c217 [label="{{|}|×|{}}"]; 224 | c218 [label="{{|}|×|{}}"]; 225 | c219 [label="{{|}|+|{}}"]; 226 | c220 [label="{{|}|+|{}}"]; 227 | c221 [label="{{|}|+|{}}"]; 228 | c222 [label="{{|}|+|{}}"]; 229 | c223 [label="{{|}|+|{}}"]; 230 | c224 [label="{{|}|+|{}}"]; 231 | c225 [label="{{|}|+|{}}"]; 232 | c226 [label="{{|}|×|{}}"]; 233 | c227 [label="{{|}|×|{}}"]; 234 | c228 [label="{{|}|×|{}}"]; 235 | c229 [label="{{|}|×|{}}"]; 236 | c230 [label="{{|}|×|{}}"]; 237 | c231 [label="{{|}|×|{}}"]; 238 | c232 [label="{{|}|×|{}}"]; 239 | c233 [label="{{|}|×|{}}"]; 240 | c234 [label="{{|}|+|{}}"]; 241 | c235 [label="{{|}|+|{}}"]; 242 | c236 [label="{{|}|+|{}}"]; 243 | c237 [label="{{|}|+|{}}"]; 244 | c238 [label="{{|}|+|{}}"]; 245 | c239 [label="{{|}|+|{}}"]; 246 | c240 [label="{{|}|+|{}}"]; 247 | c241 [label="{{|||||||||||||||}|Out}"]; 248 | c0:Out0 -> c1:In0 [label="32"]; 249 | c0:Out32 -> c1:In1 [label="32"]; 250 | c0:Out1 -> c2:In0 [label="32"]; 251 | c0:Out36 -> c2:In1 [label="32"]; 252 | c0:Out2 -> c3:In0 [label="32"]; 253 | c0:Out40 -> c3:In1 [label="32"]; 254 | c0:Out3 -> c4:In0 [label="32"]; 255 | c0:Out44 -> c4:In1 [label="32"]; 256 | c0:Out4 -> c5:In0 [label="32"]; 257 | c0:Out48 -> c5:In1 [label="32"]; 258 | c0:Out5 -> c6:In0 [label="32"]; 259 | c0:Out52 -> c6:In1 [label="32"]; 260 | c0:Out6 -> c7:In0 [label="32"]; 261 | c0:Out56 -> c7:In1 [label="32"]; 262 | c0:Out7 -> c8:In0 [label="32"]; 263 | c0:Out60 -> c8:In1 [label="32"]; 264 | c1:Out0 -> c9:In0 [label="32"]; 265 | c2:Out0 -> c9:In1 [label="32"]; 266 | c3:Out0 -> c10:In0 [label="32"]; 267 | c4:Out0 -> c10:In1 [label="32"]; 268 | c9:Out0 -> c11:In0 [label="32"]; 269 | c10:Out0 -> c11:In1 [label="32"]; 270 | c5:Out0 -> c12:In0 [label="32"]; 271 | c6:Out0 -> c12:In1 [label="32"]; 272 | c7:Out0 -> c13:In0 [label="32"]; 273 | c8:Out0 -> c13:In1 [label="32"]; 274 | c12:Out0 -> c14:In0 [label="32"]; 275 | c13:Out0 -> c14:In1 [label="32"]; 276 | c11:Out0 -> c15:In0 [label="32"]; 277 | c14:Out0 -> c15:In1 [label="32"]; 278 | c0:Out8 -> c16:In0 [label="32"]; 279 | c0:Out32 -> c16:In1 [label="32"]; 280 | c0:Out9 -> c17:In0 [label="32"]; 281 | c0:Out36 -> c17:In1 [label="32"]; 282 | c0:Out10 -> c18:In0 [label="32"]; 283 | c0:Out40 -> c18:In1 [label="32"]; 284 | c0:Out11 -> c19:In0 [label="32"]; 285 | c0:Out44 -> c19:In1 [label="32"]; 286 | c0:Out12 -> c20:In0 [label="32"]; 287 | c0:Out48 -> c20:In1 [label="32"]; 288 | c0:Out13 -> c21:In0 [label="32"]; 289 | c0:Out52 -> c21:In1 [label="32"]; 290 | c0:Out14 -> c22:In0 [label="32"]; 291 | c0:Out56 -> c22:In1 [label="32"]; 292 | c0:Out15 -> c23:In0 [label="32"]; 293 | c0:Out60 -> c23:In1 [label="32"]; 294 | c16:Out0 -> c24:In0 [label="32"]; 295 | c17:Out0 -> c24:In1 [label="32"]; 296 | c18:Out0 -> c25:In0 [label="32"]; 297 | c19:Out0 -> c25:In1 [label="32"]; 298 | c24:Out0 -> c26:In0 [label="32"]; 299 | c25:Out0 -> c26:In1 [label="32"]; 300 | c20:Out0 -> c27:In0 [label="32"]; 301 | c21:Out0 -> c27:In1 [label="32"]; 302 | c22:Out0 -> c28:In0 [label="32"]; 303 | c23:Out0 -> c28:In1 [label="32"]; 304 | c27:Out0 -> c29:In0 [label="32"]; 305 | c28:Out0 -> c29:In1 [label="32"]; 306 | c26:Out0 -> c30:In0 [label="32"]; 307 | c29:Out0 -> c30:In1 [label="32"]; 308 | c0:Out16 -> c31:In0 [label="32"]; 309 | c0:Out32 -> c31:In1 [label="32"]; 310 | c0:Out17 -> c32:In0 [label="32"]; 311 | c0:Out36 -> c32:In1 [label="32"]; 312 | c0:Out18 -> c33:In0 [label="32"]; 313 | c0:Out40 -> c33:In1 [label="32"]; 314 | c0:Out19 -> c34:In0 [label="32"]; 315 | c0:Out44 -> c34:In1 [label="32"]; 316 | c0:Out20 -> c35:In0 [label="32"]; 317 | c0:Out48 -> c35:In1 [label="32"]; 318 | c0:Out21 -> c36:In0 [label="32"]; 319 | c0:Out52 -> c36:In1 [label="32"]; 320 | c0:Out22 -> c37:In0 [label="32"]; 321 | c0:Out56 -> c37:In1 [label="32"]; 322 | c0:Out23 -> c38:In0 [label="32"]; 323 | c0:Out60 -> c38:In1 [label="32"]; 324 | c31:Out0 -> c39:In0 [label="32"]; 325 | c32:Out0 -> c39:In1 [label="32"]; 326 | c33:Out0 -> c40:In0 [label="32"]; 327 | c34:Out0 -> c40:In1 [label="32"]; 328 | c39:Out0 -> c41:In0 [label="32"]; 329 | c40:Out0 -> c41:In1 [label="32"]; 330 | c35:Out0 -> c42:In0 [label="32"]; 331 | c36:Out0 -> c42:In1 [label="32"]; 332 | c37:Out0 -> c43:In0 [label="32"]; 333 | c38:Out0 -> c43:In1 [label="32"]; 334 | c42:Out0 -> c44:In0 [label="32"]; 335 | c43:Out0 -> c44:In1 [label="32"]; 336 | c41:Out0 -> c45:In0 [label="32"]; 337 | c44:Out0 -> c45:In1 [label="32"]; 338 | c0:Out24 -> c46:In0 [label="32"]; 339 | c0:Out32 -> c46:In1 [label="32"]; 340 | c0:Out25 -> c47:In0 [label="32"]; 341 | c0:Out36 -> c47:In1 [label="32"]; 342 | c0:Out26 -> c48:In0 [label="32"]; 343 | c0:Out40 -> c48:In1 [label="32"]; 344 | c0:Out27 -> c49:In0 [label="32"]; 345 | c0:Out44 -> c49:In1 [label="32"]; 346 | c0:Out28 -> c50:In0 [label="32"]; 347 | c0:Out48 -> c50:In1 [label="32"]; 348 | c0:Out29 -> c51:In0 [label="32"]; 349 | c0:Out52 -> c51:In1 [label="32"]; 350 | c0:Out30 -> c52:In0 [label="32"]; 351 | c0:Out56 -> c52:In1 [label="32"]; 352 | c0:Out31 -> c53:In0 [label="32"]; 353 | c0:Out60 -> c53:In1 [label="32"]; 354 | c46:Out0 -> c54:In0 [label="32"]; 355 | c47:Out0 -> c54:In1 [label="32"]; 356 | c48:Out0 -> c55:In0 [label="32"]; 357 | c49:Out0 -> c55:In1 [label="32"]; 358 | c54:Out0 -> c56:In0 [label="32"]; 359 | c55:Out0 -> c56:In1 [label="32"]; 360 | c50:Out0 -> c57:In0 [label="32"]; 361 | c51:Out0 -> c57:In1 [label="32"]; 362 | c52:Out0 -> c58:In0 [label="32"]; 363 | c53:Out0 -> c58:In1 [label="32"]; 364 | c57:Out0 -> c59:In0 [label="32"]; 365 | c58:Out0 -> c59:In1 [label="32"]; 366 | c56:Out0 -> c60:In0 [label="32"]; 367 | c59:Out0 -> c60:In1 [label="32"]; 368 | c0:Out0 -> c61:In0 [label="32"]; 369 | c0:Out33 -> c61:In1 [label="32"]; 370 | c0:Out1 -> c62:In0 [label="32"]; 371 | c0:Out37 -> c62:In1 [label="32"]; 372 | c0:Out2 -> c63:In0 [label="32"]; 373 | c0:Out41 -> c63:In1 [label="32"]; 374 | c0:Out3 -> c64:In0 [label="32"]; 375 | c0:Out45 -> c64:In1 [label="32"]; 376 | c0:Out4 -> c65:In0 [label="32"]; 377 | c0:Out49 -> c65:In1 [label="32"]; 378 | c0:Out5 -> c66:In0 [label="32"]; 379 | c0:Out53 -> c66:In1 [label="32"]; 380 | c0:Out6 -> c67:In0 [label="32"]; 381 | c0:Out57 -> c67:In1 [label="32"]; 382 | c0:Out7 -> c68:In0 [label="32"]; 383 | c0:Out61 -> c68:In1 [label="32"]; 384 | c61:Out0 -> c69:In0 [label="32"]; 385 | c62:Out0 -> c69:In1 [label="32"]; 386 | c63:Out0 -> c70:In0 [label="32"]; 387 | c64:Out0 -> c70:In1 [label="32"]; 388 | c69:Out0 -> c71:In0 [label="32"]; 389 | c70:Out0 -> c71:In1 [label="32"]; 390 | c65:Out0 -> c72:In0 [label="32"]; 391 | c66:Out0 -> c72:In1 [label="32"]; 392 | c67:Out0 -> c73:In0 [label="32"]; 393 | c68:Out0 -> c73:In1 [label="32"]; 394 | c72:Out0 -> c74:In0 [label="32"]; 395 | c73:Out0 -> c74:In1 [label="32"]; 396 | c71:Out0 -> c75:In0 [label="32"]; 397 | c74:Out0 -> c75:In1 [label="32"]; 398 | c0:Out8 -> c76:In0 [label="32"]; 399 | c0:Out33 -> c76:In1 [label="32"]; 400 | c0:Out9 -> c77:In0 [label="32"]; 401 | c0:Out37 -> c77:In1 [label="32"]; 402 | c0:Out10 -> c78:In0 [label="32"]; 403 | c0:Out41 -> c78:In1 [label="32"]; 404 | c0:Out11 -> c79:In0 [label="32"]; 405 | c0:Out45 -> c79:In1 [label="32"]; 406 | c0:Out12 -> c80:In0 [label="32"]; 407 | c0:Out49 -> c80:In1 [label="32"]; 408 | c0:Out13 -> c81:In0 [label="32"]; 409 | c0:Out53 -> c81:In1 [label="32"]; 410 | c0:Out14 -> c82:In0 [label="32"]; 411 | c0:Out57 -> c82:In1 [label="32"]; 412 | c0:Out15 -> c83:In0 [label="32"]; 413 | c0:Out61 -> c83:In1 [label="32"]; 414 | c76:Out0 -> c84:In0 [label="32"]; 415 | c77:Out0 -> c84:In1 [label="32"]; 416 | c78:Out0 -> c85:In0 [label="32"]; 417 | c79:Out0 -> c85:In1 [label="32"]; 418 | c84:Out0 -> c86:In0 [label="32"]; 419 | c85:Out0 -> c86:In1 [label="32"]; 420 | c80:Out0 -> c87:In0 [label="32"]; 421 | c81:Out0 -> c87:In1 [label="32"]; 422 | c82:Out0 -> c88:In0 [label="32"]; 423 | c83:Out0 -> c88:In1 [label="32"]; 424 | c87:Out0 -> c89:In0 [label="32"]; 425 | c88:Out0 -> c89:In1 [label="32"]; 426 | c86:Out0 -> c90:In0 [label="32"]; 427 | c89:Out0 -> c90:In1 [label="32"]; 428 | c0:Out16 -> c91:In0 [label="32"]; 429 | c0:Out33 -> c91:In1 [label="32"]; 430 | c0:Out17 -> c92:In0 [label="32"]; 431 | c0:Out37 -> c92:In1 [label="32"]; 432 | c0:Out18 -> c93:In0 [label="32"]; 433 | c0:Out41 -> c93:In1 [label="32"]; 434 | c0:Out19 -> c94:In0 [label="32"]; 435 | c0:Out45 -> c94:In1 [label="32"]; 436 | c0:Out20 -> c95:In0 [label="32"]; 437 | c0:Out49 -> c95:In1 [label="32"]; 438 | c0:Out21 -> c96:In0 [label="32"]; 439 | c0:Out53 -> c96:In1 [label="32"]; 440 | c0:Out22 -> c97:In0 [label="32"]; 441 | c0:Out57 -> c97:In1 [label="32"]; 442 | c0:Out23 -> c98:In0 [label="32"]; 443 | c0:Out61 -> c98:In1 [label="32"]; 444 | c91:Out0 -> c99:In0 [label="32"]; 445 | c92:Out0 -> c99:In1 [label="32"]; 446 | c93:Out0 -> c100:In0 [label="32"]; 447 | c94:Out0 -> c100:In1 [label="32"]; 448 | c99:Out0 -> c101:In0 [label="32"]; 449 | c100:Out0 -> c101:In1 [label="32"]; 450 | c95:Out0 -> c102:In0 [label="32"]; 451 | c96:Out0 -> c102:In1 [label="32"]; 452 | c97:Out0 -> c103:In0 [label="32"]; 453 | c98:Out0 -> c103:In1 [label="32"]; 454 | c102:Out0 -> c104:In0 [label="32"]; 455 | c103:Out0 -> c104:In1 [label="32"]; 456 | c101:Out0 -> c105:In0 [label="32"]; 457 | c104:Out0 -> c105:In1 [label="32"]; 458 | c0:Out24 -> c106:In0 [label="32"]; 459 | c0:Out33 -> c106:In1 [label="32"]; 460 | c0:Out25 -> c107:In0 [label="32"]; 461 | c0:Out37 -> c107:In1 [label="32"]; 462 | c0:Out26 -> c108:In0 [label="32"]; 463 | c0:Out41 -> c108:In1 [label="32"]; 464 | c0:Out27 -> c109:In0 [label="32"]; 465 | c0:Out45 -> c109:In1 [label="32"]; 466 | c0:Out28 -> c110:In0 [label="32"]; 467 | c0:Out49 -> c110:In1 [label="32"]; 468 | c0:Out29 -> c111:In0 [label="32"]; 469 | c0:Out53 -> c111:In1 [label="32"]; 470 | c0:Out30 -> c112:In0 [label="32"]; 471 | c0:Out57 -> c112:In1 [label="32"]; 472 | c0:Out31 -> c113:In0 [label="32"]; 473 | c0:Out61 -> c113:In1 [label="32"]; 474 | c106:Out0 -> c114:In0 [label="32"]; 475 | c107:Out0 -> c114:In1 [label="32"]; 476 | c108:Out0 -> c115:In0 [label="32"]; 477 | c109:Out0 -> c115:In1 [label="32"]; 478 | c114:Out0 -> c116:In0 [label="32"]; 479 | c115:Out0 -> c116:In1 [label="32"]; 480 | c110:Out0 -> c117:In0 [label="32"]; 481 | c111:Out0 -> c117:In1 [label="32"]; 482 | c112:Out0 -> c118:In0 [label="32"]; 483 | c113:Out0 -> c118:In1 [label="32"]; 484 | c117:Out0 -> c119:In0 [label="32"]; 485 | c118:Out0 -> c119:In1 [label="32"]; 486 | c116:Out0 -> c120:In0 [label="32"]; 487 | c119:Out0 -> c120:In1 [label="32"]; 488 | c0:Out0 -> c121:In0 [label="32"]; 489 | c0:Out34 -> c121:In1 [label="32"]; 490 | c0:Out1 -> c122:In0 [label="32"]; 491 | c0:Out38 -> c122:In1 [label="32"]; 492 | c0:Out2 -> c123:In0 [label="32"]; 493 | c0:Out42 -> c123:In1 [label="32"]; 494 | c0:Out3 -> c124:In0 [label="32"]; 495 | c0:Out46 -> c124:In1 [label="32"]; 496 | c0:Out4 -> c125:In0 [label="32"]; 497 | c0:Out50 -> c125:In1 [label="32"]; 498 | c0:Out5 -> c126:In0 [label="32"]; 499 | c0:Out54 -> c126:In1 [label="32"]; 500 | c0:Out6 -> c127:In0 [label="32"]; 501 | c0:Out58 -> c127:In1 [label="32"]; 502 | c0:Out7 -> c128:In0 [label="32"]; 503 | c0:Out62 -> c128:In1 [label="32"]; 504 | c121:Out0 -> c129:In0 [label="32"]; 505 | c122:Out0 -> c129:In1 [label="32"]; 506 | c123:Out0 -> c130:In0 [label="32"]; 507 | c124:Out0 -> c130:In1 [label="32"]; 508 | c129:Out0 -> c131:In0 [label="32"]; 509 | c130:Out0 -> c131:In1 [label="32"]; 510 | c125:Out0 -> c132:In0 [label="32"]; 511 | c126:Out0 -> c132:In1 [label="32"]; 512 | c127:Out0 -> c133:In0 [label="32"]; 513 | c128:Out0 -> c133:In1 [label="32"]; 514 | c132:Out0 -> c134:In0 [label="32"]; 515 | c133:Out0 -> c134:In1 [label="32"]; 516 | c131:Out0 -> c135:In0 [label="32"]; 517 | c134:Out0 -> c135:In1 [label="32"]; 518 | c0:Out8 -> c136:In0 [label="32"]; 519 | c0:Out34 -> c136:In1 [label="32"]; 520 | c0:Out9 -> c137:In0 [label="32"]; 521 | c0:Out38 -> c137:In1 [label="32"]; 522 | c0:Out10 -> c138:In0 [label="32"]; 523 | c0:Out42 -> c138:In1 [label="32"]; 524 | c0:Out11 -> c139:In0 [label="32"]; 525 | c0:Out46 -> c139:In1 [label="32"]; 526 | c0:Out12 -> c140:In0 [label="32"]; 527 | c0:Out50 -> c140:In1 [label="32"]; 528 | c0:Out13 -> c141:In0 [label="32"]; 529 | c0:Out54 -> c141:In1 [label="32"]; 530 | c0:Out14 -> c142:In0 [label="32"]; 531 | c0:Out58 -> c142:In1 [label="32"]; 532 | c0:Out15 -> c143:In0 [label="32"]; 533 | c0:Out62 -> c143:In1 [label="32"]; 534 | c136:Out0 -> c144:In0 [label="32"]; 535 | c137:Out0 -> c144:In1 [label="32"]; 536 | c138:Out0 -> c145:In0 [label="32"]; 537 | c139:Out0 -> c145:In1 [label="32"]; 538 | c144:Out0 -> c146:In0 [label="32"]; 539 | c145:Out0 -> c146:In1 [label="32"]; 540 | c140:Out0 -> c147:In0 [label="32"]; 541 | c141:Out0 -> c147:In1 [label="32"]; 542 | c142:Out0 -> c148:In0 [label="32"]; 543 | c143:Out0 -> c148:In1 [label="32"]; 544 | c147:Out0 -> c149:In0 [label="32"]; 545 | c148:Out0 -> c149:In1 [label="32"]; 546 | c146:Out0 -> c150:In0 [label="32"]; 547 | c149:Out0 -> c150:In1 [label="32"]; 548 | c0:Out16 -> c151:In0 [label="32"]; 549 | c0:Out34 -> c151:In1 [label="32"]; 550 | c0:Out17 -> c152:In0 [label="32"]; 551 | c0:Out38 -> c152:In1 [label="32"]; 552 | c0:Out18 -> c153:In0 [label="32"]; 553 | c0:Out42 -> c153:In1 [label="32"]; 554 | c0:Out19 -> c154:In0 [label="32"]; 555 | c0:Out46 -> c154:In1 [label="32"]; 556 | c0:Out20 -> c155:In0 [label="32"]; 557 | c0:Out50 -> c155:In1 [label="32"]; 558 | c0:Out21 -> c156:In0 [label="32"]; 559 | c0:Out54 -> c156:In1 [label="32"]; 560 | c0:Out22 -> c157:In0 [label="32"]; 561 | c0:Out58 -> c157:In1 [label="32"]; 562 | c0:Out23 -> c158:In0 [label="32"]; 563 | c0:Out62 -> c158:In1 [label="32"]; 564 | c151:Out0 -> c159:In0 [label="32"]; 565 | c152:Out0 -> c159:In1 [label="32"]; 566 | c153:Out0 -> c160:In0 [label="32"]; 567 | c154:Out0 -> c160:In1 [label="32"]; 568 | c159:Out0 -> c161:In0 [label="32"]; 569 | c160:Out0 -> c161:In1 [label="32"]; 570 | c155:Out0 -> c162:In0 [label="32"]; 571 | c156:Out0 -> c162:In1 [label="32"]; 572 | c157:Out0 -> c163:In0 [label="32"]; 573 | c158:Out0 -> c163:In1 [label="32"]; 574 | c162:Out0 -> c164:In0 [label="32"]; 575 | c163:Out0 -> c164:In1 [label="32"]; 576 | c161:Out0 -> c165:In0 [label="32"]; 577 | c164:Out0 -> c165:In1 [label="32"]; 578 | c0:Out24 -> c166:In0 [label="32"]; 579 | c0:Out34 -> c166:In1 [label="32"]; 580 | c0:Out25 -> c167:In0 [label="32"]; 581 | c0:Out38 -> c167:In1 [label="32"]; 582 | c0:Out26 -> c168:In0 [label="32"]; 583 | c0:Out42 -> c168:In1 [label="32"]; 584 | c0:Out27 -> c169:In0 [label="32"]; 585 | c0:Out46 -> c169:In1 [label="32"]; 586 | c0:Out28 -> c170:In0 [label="32"]; 587 | c0:Out50 -> c170:In1 [label="32"]; 588 | c0:Out29 -> c171:In0 [label="32"]; 589 | c0:Out54 -> c171:In1 [label="32"]; 590 | c0:Out30 -> c172:In0 [label="32"]; 591 | c0:Out58 -> c172:In1 [label="32"]; 592 | c0:Out31 -> c173:In0 [label="32"]; 593 | c0:Out62 -> c173:In1 [label="32"]; 594 | c166:Out0 -> c174:In0 [label="32"]; 595 | c167:Out0 -> c174:In1 [label="32"]; 596 | c168:Out0 -> c175:In0 [label="32"]; 597 | c169:Out0 -> c175:In1 [label="32"]; 598 | c174:Out0 -> c176:In0 [label="32"]; 599 | c175:Out0 -> c176:In1 [label="32"]; 600 | c170:Out0 -> c177:In0 [label="32"]; 601 | c171:Out0 -> c177:In1 [label="32"]; 602 | c172:Out0 -> c178:In0 [label="32"]; 603 | c173:Out0 -> c178:In1 [label="32"]; 604 | c177:Out0 -> c179:In0 [label="32"]; 605 | c178:Out0 -> c179:In1 [label="32"]; 606 | c176:Out0 -> c180:In0 [label="32"]; 607 | c179:Out0 -> c180:In1 [label="32"]; 608 | c0:Out0 -> c181:In0 [label="32"]; 609 | c0:Out35 -> c181:In1 [label="32"]; 610 | c0:Out1 -> c182:In0 [label="32"]; 611 | c0:Out39 -> c182:In1 [label="32"]; 612 | c0:Out2 -> c183:In0 [label="32"]; 613 | c0:Out43 -> c183:In1 [label="32"]; 614 | c0:Out3 -> c184:In0 [label="32"]; 615 | c0:Out47 -> c184:In1 [label="32"]; 616 | c0:Out4 -> c185:In0 [label="32"]; 617 | c0:Out51 -> c185:In1 [label="32"]; 618 | c0:Out5 -> c186:In0 [label="32"]; 619 | c0:Out55 -> c186:In1 [label="32"]; 620 | c0:Out6 -> c187:In0 [label="32"]; 621 | c0:Out59 -> c187:In1 [label="32"]; 622 | c0:Out7 -> c188:In0 [label="32"]; 623 | c0:Out63 -> c188:In1 [label="32"]; 624 | c181:Out0 -> c189:In0 [label="32"]; 625 | c182:Out0 -> c189:In1 [label="32"]; 626 | c183:Out0 -> c190:In0 [label="32"]; 627 | c184:Out0 -> c190:In1 [label="32"]; 628 | c189:Out0 -> c191:In0 [label="32"]; 629 | c190:Out0 -> c191:In1 [label="32"]; 630 | c185:Out0 -> c192:In0 [label="32"]; 631 | c186:Out0 -> c192:In1 [label="32"]; 632 | c187:Out0 -> c193:In0 [label="32"]; 633 | c188:Out0 -> c193:In1 [label="32"]; 634 | c192:Out0 -> c194:In0 [label="32"]; 635 | c193:Out0 -> c194:In1 [label="32"]; 636 | c191:Out0 -> c195:In0 [label="32"]; 637 | c194:Out0 -> c195:In1 [label="32"]; 638 | c0:Out8 -> c196:In0 [label="32"]; 639 | c0:Out35 -> c196:In1 [label="32"]; 640 | c0:Out9 -> c197:In0 [label="32"]; 641 | c0:Out39 -> c197:In1 [label="32"]; 642 | c0:Out10 -> c198:In0 [label="32"]; 643 | c0:Out43 -> c198:In1 [label="32"]; 644 | c0:Out11 -> c199:In0 [label="32"]; 645 | c0:Out47 -> c199:In1 [label="32"]; 646 | c0:Out12 -> c200:In0 [label="32"]; 647 | c0:Out51 -> c200:In1 [label="32"]; 648 | c0:Out13 -> c201:In0 [label="32"]; 649 | c0:Out55 -> c201:In1 [label="32"]; 650 | c0:Out14 -> c202:In0 [label="32"]; 651 | c0:Out59 -> c202:In1 [label="32"]; 652 | c0:Out15 -> c203:In0 [label="32"]; 653 | c0:Out63 -> c203:In1 [label="32"]; 654 | c196:Out0 -> c204:In0 [label="32"]; 655 | c197:Out0 -> c204:In1 [label="32"]; 656 | c198:Out0 -> c205:In0 [label="32"]; 657 | c199:Out0 -> c205:In1 [label="32"]; 658 | c204:Out0 -> c206:In0 [label="32"]; 659 | c205:Out0 -> c206:In1 [label="32"]; 660 | c200:Out0 -> c207:In0 [label="32"]; 661 | c201:Out0 -> c207:In1 [label="32"]; 662 | c202:Out0 -> c208:In0 [label="32"]; 663 | c203:Out0 -> c208:In1 [label="32"]; 664 | c207:Out0 -> c209:In0 [label="32"]; 665 | c208:Out0 -> c209:In1 [label="32"]; 666 | c206:Out0 -> c210:In0 [label="32"]; 667 | c209:Out0 -> c210:In1 [label="32"]; 668 | c0:Out16 -> c211:In0 [label="32"]; 669 | c0:Out35 -> c211:In1 [label="32"]; 670 | c0:Out17 -> c212:In0 [label="32"]; 671 | c0:Out39 -> c212:In1 [label="32"]; 672 | c0:Out18 -> c213:In0 [label="32"]; 673 | c0:Out43 -> c213:In1 [label="32"]; 674 | c0:Out19 -> c214:In0 [label="32"]; 675 | c0:Out47 -> c214:In1 [label="32"]; 676 | c0:Out20 -> c215:In0 [label="32"]; 677 | c0:Out51 -> c215:In1 [label="32"]; 678 | c0:Out21 -> c216:In0 [label="32"]; 679 | c0:Out55 -> c216:In1 [label="32"]; 680 | c0:Out22 -> c217:In0 [label="32"]; 681 | c0:Out59 -> c217:In1 [label="32"]; 682 | c0:Out23 -> c218:In0 [label="32"]; 683 | c0:Out63 -> c218:In1 [label="32"]; 684 | c211:Out0 -> c219:In0 [label="32"]; 685 | c212:Out0 -> c219:In1 [label="32"]; 686 | c213:Out0 -> c220:In0 [label="32"]; 687 | c214:Out0 -> c220:In1 [label="32"]; 688 | c219:Out0 -> c221:In0 [label="32"]; 689 | c220:Out0 -> c221:In1 [label="32"]; 690 | c215:Out0 -> c222:In0 [label="32"]; 691 | c216:Out0 -> c222:In1 [label="32"]; 692 | c217:Out0 -> c223:In0 [label="32"]; 693 | c218:Out0 -> c223:In1 [label="32"]; 694 | c222:Out0 -> c224:In0 [label="32"]; 695 | c223:Out0 -> c224:In1 [label="32"]; 696 | c221:Out0 -> c225:In0 [label="32"]; 697 | c224:Out0 -> c225:In1 [label="32"]; 698 | c0:Out24 -> c226:In0 [label="32"]; 699 | c0:Out35 -> c226:In1 [label="32"]; 700 | c0:Out25 -> c227:In0 [label="32"]; 701 | c0:Out39 -> c227:In1 [label="32"]; 702 | c0:Out26 -> c228:In0 [label="32"]; 703 | c0:Out43 -> c228:In1 [label="32"]; 704 | c0:Out27 -> c229:In0 [label="32"]; 705 | c0:Out47 -> c229:In1 [label="32"]; 706 | c0:Out28 -> c230:In0 [label="32"]; 707 | c0:Out51 -> c230:In1 [label="32"]; 708 | c0:Out29 -> c231:In0 [label="32"]; 709 | c0:Out55 -> c231:In1 [label="32"]; 710 | c0:Out30 -> c232:In0 [label="32"]; 711 | c0:Out59 -> c232:In1 [label="32"]; 712 | c0:Out31 -> c233:In0 [label="32"]; 713 | c0:Out63 -> c233:In1 [label="32"]; 714 | c226:Out0 -> c234:In0 [label="32"]; 715 | c227:Out0 -> c234:In1 [label="32"]; 716 | c228:Out0 -> c235:In0 [label="32"]; 717 | c229:Out0 -> c235:In1 [label="32"]; 718 | c234:Out0 -> c236:In0 [label="32"]; 719 | c235:Out0 -> c236:In1 [label="32"]; 720 | c230:Out0 -> c237:In0 [label="32"]; 721 | c231:Out0 -> c237:In1 [label="32"]; 722 | c232:Out0 -> c238:In0 [label="32"]; 723 | c233:Out0 -> c238:In1 [label="32"]; 724 | c237:Out0 -> c239:In0 [label="32"]; 725 | c238:Out0 -> c239:In1 [label="32"]; 726 | c236:Out0 -> c240:In0 [label="32"]; 727 | c239:Out0 -> c240:In1 [label="32"]; 728 | c15:Out0 -> c241:In0 [label="32"]; 729 | c75:Out0 -> c241:In1 [label="32"]; 730 | c135:Out0 -> c241:In2 [label="32"]; 731 | c195:Out0 -> c241:In3 [label="32"]; 732 | c30:Out0 -> c241:In4 [label="32"]; 733 | c90:Out0 -> c241:In5 [label="32"]; 734 | c150:Out0 -> c241:In6 [label="32"]; 735 | c210:Out0 -> c241:In7 [label="32"]; 736 | c45:Out0 -> c241:In8 [label="32"]; 737 | c105:Out0 -> c241:In9 [label="32"]; 738 | c165:Out0 -> c241:In10 [label="32"]; 739 | c225:Out0 -> c241:In11 [label="32"]; 740 | c60:Out0 -> c241:In12 [label="32"]; 741 | c120:Out0 -> c241:In13 [label="32"]; 742 | c180:Out0 -> c241:In14 [label="32"]; 743 | c240:Out0 -> c241:In15 [label="32"]; 744 | } 745 | -------------------------------------------------------------------------------- /dots/composeLin-v234.dot: -------------------------------------------------------------------------------- 1 | digraph composeLin_v234 { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | bgcolor=transparent; 5 | ranksep=3; 6 | c1 [label="{{|}|+|{}}"]; 7 | c2 [label="{{|}|+|{}}"]; 8 | c3 [label="{{|}|+|{}}"]; 9 | c4 [label="{{|}|+|{}}"]; 10 | c5 [label="{{|}|+|{}}"]; 11 | c6 [label="{{|}|+|{}}"]; 12 | c7 [label="{{|}|+|{}}"]; 13 | c8 [label="{{|}|+|{}}"]; 14 | c9 [label="{{|}|+|{}}"]; 15 | c10 [label="{{|}|+|{}}"]; 16 | c11 [label="{{|}|+|{}}"]; 17 | c12 [label="{{|}|+|{}}"]; 18 | c13 [label="{{|}|+|{}}"]; 19 | c14 [label="{{|}|+|{}}"]; 20 | c15 [label="{{|}|+|{}}"]; 21 | c16 [label="{{|}|+|{}}"]; 22 | c18 [label="{In|{|||||||||||||||||}}"]; 23 | c19 [label="{{|||||||}|Out}"]; 24 | c20 [label="{{|}|×|{}}"]; 25 | c21 [label="{{|}|×|{}}"]; 26 | c22 [label="{{|}|×|{}}"]; 27 | c23 [label="{{|}|×|{}}"]; 28 | c24 [label="{{|}|×|{}}"]; 29 | c25 [label="{{|}|×|{}}"]; 30 | c26 [label="{{|}|×|{}}"]; 31 | c27 [label="{{|}|×|{}}"]; 32 | c28 [label="{{|}|×|{}}"]; 33 | c29 [label="{{|}|×|{}}"]; 34 | c30 [label="{{|}|×|{}}"]; 35 | c31 [label="{{|}|×|{}}"]; 36 | c32 [label="{{|}|×|{}}"]; 37 | c33 [label="{{|}|×|{}}"]; 38 | c34 [label="{{|}|×|{}}"]; 39 | c35 [label="{{|}|×|{}}"]; 40 | c36 [label="{{|}|×|{}}"]; 41 | c37 [label="{{|}|×|{}}"]; 42 | c38 [label="{{|}|×|{}}"]; 43 | c39 [label="{{|}|×|{}}"]; 44 | c40 [label="{{|}|×|{}}"]; 45 | c41 [label="{{|}|×|{}}"]; 46 | c42 [label="{{|}|×|{}}"]; 47 | c43 [label="{{|}|×|{}}"]; 48 | c20:Out0 -> c1:In0 [label=32,fontsize=10]; 49 | c2:Out0 -> c1:In1 [label=32,fontsize=10]; 50 | c22:Out0 -> c2:In0 [label=32,fontsize=10]; 51 | c24:Out0 -> c2:In1 [label=32,fontsize=10]; 52 | c26:Out0 -> c3:In0 [label=32,fontsize=10]; 53 | c4:Out0 -> c3:In1 [label=32,fontsize=10]; 54 | c28:Out0 -> c4:In0 [label=32,fontsize=10]; 55 | c30:Out0 -> c4:In1 [label=32,fontsize=10]; 56 | c32:Out0 -> c5:In0 [label=32,fontsize=10]; 57 | c6:Out0 -> c5:In1 [label=32,fontsize=10]; 58 | c34:Out0 -> c6:In0 [label=32,fontsize=10]; 59 | c36:Out0 -> c6:In1 [label=32,fontsize=10]; 60 | c38:Out0 -> c7:In0 [label=32,fontsize=10]; 61 | c8:Out0 -> c7:In1 [label=32,fontsize=10]; 62 | c40:Out0 -> c8:In0 [label=32,fontsize=10]; 63 | c42:Out0 -> c8:In1 [label=32,fontsize=10]; 64 | c21:Out0 -> c9:In0 [label=32,fontsize=10]; 65 | c10:Out0 -> c9:In1 [label=32,fontsize=10]; 66 | c23:Out0 -> c10:In0 [label=32,fontsize=10]; 67 | c25:Out0 -> c10:In1 [label=32,fontsize=10]; 68 | c27:Out0 -> c11:In0 [label=32,fontsize=10]; 69 | c12:Out0 -> c11:In1 [label=32,fontsize=10]; 70 | c29:Out0 -> c12:In0 [label=32,fontsize=10]; 71 | c31:Out0 -> c12:In1 [label=32,fontsize=10]; 72 | c33:Out0 -> c13:In0 [label=32,fontsize=10]; 73 | c14:Out0 -> c13:In1 [label=32,fontsize=10]; 74 | c35:Out0 -> c14:In0 [label=32,fontsize=10]; 75 | c37:Out0 -> c14:In1 [label=32,fontsize=10]; 76 | c39:Out0 -> c15:In0 [label=32,fontsize=10]; 77 | c16:Out0 -> c15:In1 [label=32,fontsize=10]; 78 | c41:Out0 -> c16:In0 [label=32,fontsize=10]; 79 | c43:Out0 -> c16:In1 [label=32,fontsize=10]; 80 | c1:Out0 -> c19:In0 [label=32,fontsize=10]; 81 | c9:Out0 -> c19:In1 [label=32,fontsize=10]; 82 | c3:Out0 -> c19:In2 [label=32,fontsize=10]; 83 | c11:Out0 -> c19:In3 [label=32,fontsize=10]; 84 | c5:Out0 -> c19:In4 [label=32,fontsize=10]; 85 | c13:Out0 -> c19:In5 [label=32,fontsize=10]; 86 | c7:Out0 -> c19:In6 [label=32,fontsize=10]; 87 | c15:Out0 -> c19:In7 [label=32,fontsize=10]; 88 | c18:Out0 -> c20:In0 [label=32,fontsize=10]; 89 | c18:Out12 -> c20:In1 [label=32,fontsize=10]; 90 | c18:Out0 -> c21:In0 [label=32,fontsize=10]; 91 | c18:Out13 -> c21:In1 [label=32,fontsize=10]; 92 | c18:Out1 -> c22:In0 [label=32,fontsize=10]; 93 | c18:Out14 -> c22:In1 [label=32,fontsize=10]; 94 | c18:Out1 -> c23:In0 [label=32,fontsize=10]; 95 | c18:Out15 -> c23:In1 [label=32,fontsize=10]; 96 | c18:Out2 -> c24:In0 [label=32,fontsize=10]; 97 | c18:Out16 -> c24:In1 [label=32,fontsize=10]; 98 | c18:Out2 -> c25:In0 [label=32,fontsize=10]; 99 | c18:Out17 -> c25:In1 [label=32,fontsize=10]; 100 | c18:Out3 -> c26:In0 [label=32,fontsize=10]; 101 | c18:Out12 -> c26:In1 [label=32,fontsize=10]; 102 | c18:Out3 -> c27:In0 [label=32,fontsize=10]; 103 | c18:Out13 -> c27:In1 [label=32,fontsize=10]; 104 | c18:Out4 -> c28:In0 [label=32,fontsize=10]; 105 | c18:Out14 -> c28:In1 [label=32,fontsize=10]; 106 | c18:Out4 -> c29:In0 [label=32,fontsize=10]; 107 | c18:Out15 -> c29:In1 [label=32,fontsize=10]; 108 | c18:Out5 -> c30:In0 [label=32,fontsize=10]; 109 | c18:Out16 -> c30:In1 [label=32,fontsize=10]; 110 | c18:Out5 -> c31:In0 [label=32,fontsize=10]; 111 | c18:Out17 -> c31:In1 [label=32,fontsize=10]; 112 | c18:Out6 -> c32:In0 [label=32,fontsize=10]; 113 | c18:Out12 -> c32:In1 [label=32,fontsize=10]; 114 | c18:Out6 -> c33:In0 [label=32,fontsize=10]; 115 | c18:Out13 -> c33:In1 [label=32,fontsize=10]; 116 | c18:Out7 -> c34:In0 [label=32,fontsize=10]; 117 | c18:Out14 -> c34:In1 [label=32,fontsize=10]; 118 | c18:Out7 -> c35:In0 [label=32,fontsize=10]; 119 | c18:Out15 -> c35:In1 [label=32,fontsize=10]; 120 | c18:Out8 -> c36:In0 [label=32,fontsize=10]; 121 | c18:Out16 -> c36:In1 [label=32,fontsize=10]; 122 | c18:Out8 -> c37:In0 [label=32,fontsize=10]; 123 | c18:Out17 -> c37:In1 [label=32,fontsize=10]; 124 | c18:Out9 -> c38:In0 [label=32,fontsize=10]; 125 | c18:Out12 -> c38:In1 [label=32,fontsize=10]; 126 | c18:Out9 -> c39:In0 [label=32,fontsize=10]; 127 | c18:Out13 -> c39:In1 [label=32,fontsize=10]; 128 | c18:Out10 -> c40:In0 [label=32,fontsize=10]; 129 | c18:Out14 -> c40:In1 [label=32,fontsize=10]; 130 | c18:Out10 -> c41:In0 [label=32,fontsize=10]; 131 | c18:Out15 -> c41:In1 [label=32,fontsize=10]; 132 | c18:Out11 -> c42:In0 [label=32,fontsize=10]; 133 | c18:Out16 -> c42:In1 [label=32,fontsize=10]; 134 | c18:Out11 -> c43:In0 [label=32,fontsize=10]; 135 | c18:Out17 -> c43:In1 [label=32,fontsize=10]; 136 | } 137 | 138 | // Components: 16 +, 24 ×, 40 total. Max depth: 3. 139 | -------------------------------------------------------------------------------- /dots/crcSKf-rt2-no-opt.dot: -------------------------------------------------------------------------------- 1 | digraph crcSKf_rt2_no_opt { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | bgcolor=transparent; 5 | nslimit=20; 6 | c0 [label="{{}|Cons False|{}}"]; 7 | c1 [label="{{}|Cons False|{}}"]; 8 | c2 [label="{{}|Cons False|{}}"]; 9 | c3 [label="{{}|Cons False|{}}"]; 10 | c4 [label="{False|{}}"]; 11 | c5 [label="{In|{}}"]; 12 | c7 [label="{{|||}|Out}"]; 13 | c9 [label="{True|{}}"]; 14 | c10 [label="{{||}|if|{}}"]; 15 | c11 [label="{{||}|if|{}}"]; 16 | c12 [label="{{||}|if|{}}"]; 17 | c13 [label="{{||}|if|{}}"]; 18 | c14 [label="{{|}|⊕|{}}"]; 19 | c15 [label="{{|}|⊕|{}}"]; 20 | c16 [label="{{|}|⊕|{}}"]; 21 | c17 [label="{{|}|⊕|{}}"]; 22 | c10:Out0 -> c0:In0 []; 23 | c11:Out0 -> c1:In0 []; 24 | c12:Out0 -> c2:In0 []; 25 | c13:Out0 -> c3:In0 []; 26 | c10:Out0 -> c7:In0 []; 27 | c11:Out0 -> c7:In1 []; 28 | c12:Out0 -> c7:In2 []; 29 | c13:Out0 -> c7:In3 []; 30 | c0:Out0 -> c10:In0 []; 31 | c15:Out0 -> c10:In1 []; 32 | c1:Out0 -> c10:In2 []; 33 | c0:Out0 -> c11:In0 []; 34 | c16:Out0 -> c11:In1 []; 35 | c2:Out0 -> c11:In2 []; 36 | c0:Out0 -> c12:In0 []; 37 | c17:Out0 -> c12:In1 []; 38 | c3:Out0 -> c12:In2 []; 39 | c0:Out0 -> c13:In0 []; 40 | c14:Out0 -> c13:In1 []; 41 | c5:Out0 -> c13:In2 []; 42 | c9:Out0 -> c14:In0 []; 43 | c5:Out0 -> c14:In1 []; 44 | c9:Out0 -> c15:In0 []; 45 | c1:Out0 -> c15:In1 []; 46 | c4:Out0 -> c16:In0 []; 47 | c2:Out0 -> c16:In1 []; 48 | c4:Out0 -> c17:In0 []; 49 | c3:Out0 -> c17:In1 []; 50 | } 51 | 52 | // Components: 4 Cons False, 1 False, 1 True, 4 if, 4 ⊕, 14 total. Max depth: 2. 53 | -------------------------------------------------------------------------------- /dots/crcSKf-rt2.dot: -------------------------------------------------------------------------------- 1 | digraph crcSKf_rt2 { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | bgcolor=transparent; 5 | nslimit=20; 6 | c0 [label="{{}|Cons False|{}}"]; 7 | c1 [label="{{}|Cons False|{}}"]; 8 | c2 [label="{{}|Cons False|{}}"]; 9 | c3 [label="{{}|Cons False|{}}"]; 10 | c5 [label="{In|{}}"]; 11 | c7 [label="{{|||}|Out}"]; 12 | c12 [label="{{|}|⊕|{}}"]; 13 | c13 [label="{{|}|⊕|{}}"]; 14 | c13:Out0 -> c0:In0 []; 15 | c2:Out0 -> c1:In0 []; 16 | c3:Out0 -> c2:In0 []; 17 | c12:Out0 -> c3:In0 []; 18 | c13:Out0 -> c7:In0 []; 19 | c2:Out0 -> c7:In1 []; 20 | c3:Out0 -> c7:In2 []; 21 | c12:Out0 -> c7:In3 []; 22 | c5:Out0 -> c12:In0 []; 23 | c0:Out0 -> c12:In1 []; 24 | c0:Out0 -> c13:In0 []; 25 | c1:Out0 -> c13:In1 []; 26 | } 27 | 28 | // Components: 4 Cons False, 2 ⊕, 6 total. Max depth: 1. 29 | -------------------------------------------------------------------------------- /dots/dotsp-pt1.dot: -------------------------------------------------------------------------------- 1 | digraph { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | // ratio=1; 5 | c0 [label="{In|{|||}}"]; 6 | c1 [label="{{|}|×|{}}"]; 7 | c2 [label="{{|}|×|{}}"]; 8 | c3 [label="{{|}|+|{}}"]; 9 | c4 [label="{{}|Out}"]; 10 | c0:Out0 -> c1:In0 [label="32"]; 11 | c0:Out2 -> c1:In1 [label="32"]; 12 | c0:Out1 -> c2:In0 [label="32"]; 13 | c0:Out3 -> c2:In1 [label="32"]; 14 | c1:Out0 -> c3:In0 [label="32"]; 15 | c2:Out0 -> c3:In1 [label="32"]; 16 | c3:Out0 -> c4:In0 [label="32"]; 17 | } 18 | -------------------------------------------------------------------------------- /dots/dotsp-pt2.dot: -------------------------------------------------------------------------------- 1 | digraph { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | // ratio=1; 5 | ranksep=1; 6 | c0 [label="{In|{|||||||}}"]; 7 | // removed disconnected (); 8 | // removed disconnected (); 9 | // removed disconnected (); 10 | c4 [label="{{|}|×|{}}"]; 11 | c5 [label="{{|}|×|{}}"]; 12 | c6 [label="{{|}|×|{}}"]; 13 | c7 [label="{{|}|×|{}}"]; 14 | c8 [label="{{|}|+|{}}"]; 15 | c9 [label="{{|}|+|{}}"]; 16 | c10 [label="{{|}|+|{}}"]; 17 | c11 [label="{{}|Out}"]; 18 | c0:Out0 -> c4:In0 [label="32"]; 19 | c0:Out4 -> c4:In1 [label="32"]; 20 | c0:Out1 -> c5:In0 [label="32"]; 21 | c0:Out5 -> c5:In1 [label="32"]; 22 | c0:Out2 -> c6:In0 [label="32"]; 23 | c0:Out6 -> c6:In1 [label="32"]; 24 | c0:Out3 -> c7:In0 [label="32"]; 25 | c0:Out7 -> c7:In1 [label="32"]; 26 | c4:Out0 -> c8:In0 [label="32"]; 27 | c5:Out0 -> c8:In1 [label="32"]; 28 | c6:Out0 -> c9:In0 [label="32"]; 29 | c7:Out0 -> c9:In1 [label="32"]; 30 | c8:Out0 -> c10:In0 [label="32"]; 31 | c9:Out0 -> c10:In1 [label="32"]; 32 | c10:Out0 -> c11:In0 [label="32"]; 33 | } 34 | -------------------------------------------------------------------------------- /dots/dotsp-pt3.dot: -------------------------------------------------------------------------------- 1 | digraph dotsp_pt3 { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | bgcolor=transparent; 5 | c0 [label="{{|}|+|{}}"]; 6 | c1 [label="{{|}|+|{}}"]; 7 | c2 [label="{{|}|+|{}}"]; 8 | c3 [label="{{|}|+|{}}"]; 9 | c4 [label="{{|}|+|{}}"]; 10 | c5 [label="{{|}|+|{}}"]; 11 | c6 [label="{{|}|+|{}}"]; 12 | c7 [label="{In|{|||||||||||||||}}"]; 13 | c8 [label="{{}|Out}"]; 14 | c9 [label="{{|}|×|{}}"]; 15 | c10 [label="{{|}|×|{}}"]; 16 | c11 [label="{{|}|×|{}}"]; 17 | c12 [label="{{|}|×|{}}"]; 18 | c13 [label="{{|}|×|{}}"]; 19 | c14 [label="{{|}|×|{}}"]; 20 | c15 [label="{{|}|×|{}}"]; 21 | c16 [label="{{|}|×|{}}"]; 22 | c9:Out0 -> c0:In0 [label=32,fontsize=10]; 23 | c10:Out0 -> c0:In1 [label=32,fontsize=10]; 24 | c11:Out0 -> c1:In0 [label=32,fontsize=10]; 25 | c12:Out0 -> c1:In1 [label=32,fontsize=10]; 26 | c13:Out0 -> c2:In0 [label=32,fontsize=10]; 27 | c14:Out0 -> c2:In1 [label=32,fontsize=10]; 28 | c15:Out0 -> c3:In0 [label=32,fontsize=10]; 29 | c16:Out0 -> c3:In1 [label=32,fontsize=10]; 30 | c0:Out0 -> c4:In0 [label=32,fontsize=10]; 31 | c1:Out0 -> c4:In1 [label=32,fontsize=10]; 32 | c4:Out0 -> c5:In0 [label=32,fontsize=10]; 33 | c6:Out0 -> c5:In1 [label=32,fontsize=10]; 34 | c2:Out0 -> c6:In0 [label=32,fontsize=10]; 35 | c3:Out0 -> c6:In1 [label=32,fontsize=10]; 36 | c5:Out0 -> c8:In0 [label=32,fontsize=10]; 37 | c7:Out0 -> c9:In0 [label=32,fontsize=10]; 38 | c7:Out8 -> c9:In1 [label=32,fontsize=10]; 39 | c7:Out1 -> c10:In0 [label=32,fontsize=10]; 40 | c7:Out9 -> c10:In1 [label=32,fontsize=10]; 41 | c7:Out2 -> c11:In0 [label=32,fontsize=10]; 42 | c7:Out10 -> c11:In1 [label=32,fontsize=10]; 43 | c7:Out3 -> c12:In0 [label=32,fontsize=10]; 44 | c7:Out11 -> c12:In1 [label=32,fontsize=10]; 45 | c7:Out4 -> c13:In0 [label=32,fontsize=10]; 46 | c7:Out12 -> c13:In1 [label=32,fontsize=10]; 47 | c7:Out5 -> c14:In0 [label=32,fontsize=10]; 48 | c7:Out13 -> c14:In1 [label=32,fontsize=10]; 49 | c7:Out6 -> c15:In0 [label=32,fontsize=10]; 50 | c7:Out14 -> c15:In1 [label=32,fontsize=10]; 51 | c7:Out7 -> c16:In0 [label=32,fontsize=10]; 52 | c7:Out15 -> c16:In1 [label=32,fontsize=10]; 53 | } 54 | 55 | // Components: 7 +, 8 ×, 15 total. Max depth: 4. 56 | -------------------------------------------------------------------------------- /dots/dotsp-pt4.dot: -------------------------------------------------------------------------------- 1 | digraph { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | // ratio=1; 5 | c0 [label="{In|{|||||||||||||||||||||||||||||||}}"]; 6 | // removed disconnected (); 7 | // removed disconnected (); 8 | // removed disconnected (); 9 | // removed disconnected (); 10 | // removed disconnected (); 11 | c6 [label="{{|}|×|{}}"]; 12 | c7 [label="{{|}|×|{}}"]; 13 | c8 [label="{{|}|×|{}}"]; 14 | c9 [label="{{|}|×|{}}"]; 15 | c10 [label="{{|}|×|{}}"]; 16 | c11 [label="{{|}|×|{}}"]; 17 | c12 [label="{{|}|×|{}}"]; 18 | c13 [label="{{|}|×|{}}"]; 19 | c14 [label="{{|}|×|{}}"]; 20 | c15 [label="{{|}|×|{}}"]; 21 | c16 [label="{{|}|×|{}}"]; 22 | c17 [label="{{|}|×|{}}"]; 23 | c18 [label="{{|}|×|{}}"]; 24 | c19 [label="{{|}|×|{}}"]; 25 | c20 [label="{{|}|×|{}}"]; 26 | c21 [label="{{|}|×|{}}"]; 27 | c22 [label="{{|}|+|{}}"]; 28 | c23 [label="{{|}|+|{}}"]; 29 | c24 [label="{{|}|+|{}}"]; 30 | c25 [label="{{|}|+|{}}"]; 31 | c26 [label="{{|}|+|{}}"]; 32 | c27 [label="{{|}|+|{}}"]; 33 | c28 [label="{{|}|+|{}}"]; 34 | c29 [label="{{|}|+|{}}"]; 35 | c30 [label="{{|}|+|{}}"]; 36 | c31 [label="{{|}|+|{}}"]; 37 | c32 [label="{{|}|+|{}}"]; 38 | c33 [label="{{|}|+|{}}"]; 39 | c34 [label="{{|}|+|{}}"]; 40 | c35 [label="{{|}|+|{}}"]; 41 | c36 [label="{{|}|+|{}}"]; 42 | c37 [label="{{}|Out}"]; 43 | c0:Out0 -> c6:In0 [label="32"]; 44 | c0:Out16 -> c6:In1 [label="32"]; 45 | c0:Out1 -> c7:In0 [label="32"]; 46 | c0:Out17 -> c7:In1 [label="32"]; 47 | c0:Out2 -> c8:In0 [label="32"]; 48 | c0:Out18 -> c8:In1 [label="32"]; 49 | c0:Out3 -> c9:In0 [label="32"]; 50 | c0:Out19 -> c9:In1 [label="32"]; 51 | c0:Out4 -> c10:In0 [label="32"]; 52 | c0:Out20 -> c10:In1 [label="32"]; 53 | c0:Out5 -> c11:In0 [label="32"]; 54 | c0:Out21 -> c11:In1 [label="32"]; 55 | c0:Out6 -> c12:In0 [label="32"]; 56 | c0:Out22 -> c12:In1 [label="32"]; 57 | c0:Out7 -> c13:In0 [label="32"]; 58 | c0:Out23 -> c13:In1 [label="32"]; 59 | c0:Out8 -> c14:In0 [label="32"]; 60 | c0:Out24 -> c14:In1 [label="32"]; 61 | c0:Out9 -> c15:In0 [label="32"]; 62 | c0:Out25 -> c15:In1 [label="32"]; 63 | c0:Out10 -> c16:In0 [label="32"]; 64 | c0:Out26 -> c16:In1 [label="32"]; 65 | c0:Out11 -> c17:In0 [label="32"]; 66 | c0:Out27 -> c17:In1 [label="32"]; 67 | c0:Out12 -> c18:In0 [label="32"]; 68 | c0:Out28 -> c18:In1 [label="32"]; 69 | c0:Out13 -> c19:In0 [label="32"]; 70 | c0:Out29 -> c19:In1 [label="32"]; 71 | c0:Out14 -> c20:In0 [label="32"]; 72 | c0:Out30 -> c20:In1 [label="32"]; 73 | c0:Out15 -> c21:In0 [label="32"]; 74 | c0:Out31 -> c21:In1 [label="32"]; 75 | c6:Out0 -> c22:In0 [label="32"]; 76 | c7:Out0 -> c22:In1 [label="32"]; 77 | c8:Out0 -> c23:In0 [label="32"]; 78 | c9:Out0 -> c23:In1 [label="32"]; 79 | c22:Out0 -> c24:In0 [label="32"]; 80 | c23:Out0 -> c24:In1 [label="32"]; 81 | c10:Out0 -> c25:In0 [label="32"]; 82 | c11:Out0 -> c25:In1 [label="32"]; 83 | c12:Out0 -> c26:In0 [label="32"]; 84 | c13:Out0 -> c26:In1 [label="32"]; 85 | c25:Out0 -> c27:In0 [label="32"]; 86 | c26:Out0 -> c27:In1 [label="32"]; 87 | c24:Out0 -> c28:In0 [label="32"]; 88 | c27:Out0 -> c28:In1 [label="32"]; 89 | c14:Out0 -> c29:In0 [label="32"]; 90 | c15:Out0 -> c29:In1 [label="32"]; 91 | c16:Out0 -> c30:In0 [label="32"]; 92 | c17:Out0 -> c30:In1 [label="32"]; 93 | c29:Out0 -> c31:In0 [label="32"]; 94 | c30:Out0 -> c31:In1 [label="32"]; 95 | c18:Out0 -> c32:In0 [label="32"]; 96 | c19:Out0 -> c32:In1 [label="32"]; 97 | c20:Out0 -> c33:In0 [label="32"]; 98 | c21:Out0 -> c33:In1 [label="32"]; 99 | c32:Out0 -> c34:In0 [label="32"]; 100 | c33:Out0 -> c34:In1 [label="32"]; 101 | c31:Out0 -> c35:In0 [label="32"]; 102 | c34:Out0 -> c35:In1 [label="32"]; 103 | c28:Out0 -> c36:In0 [label="32"]; 104 | c35:Out0 -> c36:In1 [label="32"]; 105 | c36:Out0 -> c37:In0 [label="32"]; 106 | } 107 | -------------------------------------------------------------------------------- /dots/dotsp-t2t2.dot: -------------------------------------------------------------------------------- 1 | digraph dotsp_t2t2 { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | bgcolor=transparent; 5 | c0 [label="{In|{|||||||||||||||}}"]; 6 | c2 [label="{{}|Out}"]; 7 | c4 [label="{{|}|+|{}}"]; 8 | c5 [label="{{|}|+|{}}"]; 9 | c6 [label="{{|}|+|{}}"]; 10 | c7 [label="{{|}|×|{}}"]; 11 | c8 [label="{{|}|×|{}}"]; 12 | c9 [label="{{|}|×|{}}"]; 13 | c10 [label="{{|}|×|{}}"]; 14 | c11 [label="{{|}|×|{}}"]; 15 | c12 [label="{{|}|×|{}}"]; 16 | c13 [label="{{|}|×|{}}"]; 17 | c14 [label="{{|}|×|{}}"]; 18 | c15 [label="{{|}|×|{}}"]; 19 | c16 [label="{{|}|×|{}}"]; 20 | c17 [label="{{|}|×|{}}"]; 21 | c18 [label="{{|}|×|{}}"]; 22 | c6:Out0 -> c2:In0 [label=32,fontsize=10]; 23 | c15:Out0 -> c4:In0 [label=32,fontsize=10]; 24 | c16:Out0 -> c4:In1 [label=32,fontsize=10]; 25 | c17:Out0 -> c5:In0 [label=32,fontsize=10]; 26 | c18:Out0 -> c5:In1 [label=32,fontsize=10]; 27 | c4:Out0 -> c6:In0 [label=32,fontsize=10]; 28 | c5:Out0 -> c6:In1 [label=32,fontsize=10]; 29 | c0:Out0 -> c7:In0 [label=32,fontsize=10]; 30 | c0:Out4 -> c7:In1 [label=32,fontsize=10]; 31 | c0:Out1 -> c8:In0 [label=32,fontsize=10]; 32 | c0:Out5 -> c8:In1 [label=32,fontsize=10]; 33 | c0:Out2 -> c9:In0 [label=32,fontsize=10]; 34 | c0:Out6 -> c9:In1 [label=32,fontsize=10]; 35 | c0:Out3 -> c10:In0 [label=32,fontsize=10]; 36 | c0:Out7 -> c10:In1 [label=32,fontsize=10]; 37 | c0:Out8 -> c11:In0 [label=32,fontsize=10]; 38 | c0:Out12 -> c11:In1 [label=32,fontsize=10]; 39 | c0:Out9 -> c12:In0 [label=32,fontsize=10]; 40 | c0:Out13 -> c12:In1 [label=32,fontsize=10]; 41 | c0:Out10 -> c13:In0 [label=32,fontsize=10]; 42 | c0:Out14 -> c13:In1 [label=32,fontsize=10]; 43 | c0:Out11 -> c14:In0 [label=32,fontsize=10]; 44 | c0:Out15 -> c14:In1 [label=32,fontsize=10]; 45 | c7:Out0 -> c15:In0 [label=32,fontsize=10]; 46 | c11:Out0 -> c15:In1 [label=32,fontsize=10]; 47 | c8:Out0 -> c16:In0 [label=32,fontsize=10]; 48 | c12:Out0 -> c16:In1 [label=32,fontsize=10]; 49 | c9:Out0 -> c17:In0 [label=32,fontsize=10]; 50 | c13:Out0 -> c17:In1 [label=32,fontsize=10]; 51 | c10:Out0 -> c18:In0 [label=32,fontsize=10]; 52 | c14:Out0 -> c18:In1 [label=32,fontsize=10]; 53 | } 54 | 55 | // Components: 3 add, 12 mul, 15 total. Depth: 4. 56 | -------------------------------------------------------------------------------- /dots/dotsp-v3t2.dot: -------------------------------------------------------------------------------- 1 | digraph { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | // ratio=1; 5 | c0 [label="{In|{|||||||||||}}"]; 6 | c1 [label="{{|}|×|{}}"]; 7 | c2 [label="{{|}|×|{}}"]; 8 | c3 [label="{{|}|×|{}}"]; 9 | c4 [label="{{|}|×|{}}"]; 10 | c5 [label="{{|}|×|{}}"]; 11 | c6 [label="{{|}|×|{}}"]; 12 | c7 [label="{{|}|×|{}}"]; 13 | c8 [label="{{|}|×|{}}"]; 14 | c9 [label="{{|}|+|{}}"]; 15 | c10 [label="{{|}|+|{}}"]; 16 | c11 [label="{{|}|+|{}}"]; 17 | c12 [label="{{}|Out}"]; 18 | c0:Out4 -> c1:In0 [label="32"]; 19 | c0:Out8 -> c1:In1 [label="32"]; 20 | c0:Out5 -> c2:In0 [label="32"]; 21 | c0:Out9 -> c2:In1 [label="32"]; 22 | c0:Out6 -> c3:In0 [label="32"]; 23 | c0:Out10 -> c3:In1 [label="32"]; 24 | c0:Out7 -> c4:In0 [label="32"]; 25 | c0:Out11 -> c4:In1 [label="32"]; 26 | c0:Out0 -> c5:In0 [label="32"]; 27 | c1:Out0 -> c5:In1 [label="32"]; 28 | c0:Out1 -> c6:In0 [label="32"]; 29 | c2:Out0 -> c6:In1 [label="32"]; 30 | c0:Out2 -> c7:In0 [label="32"]; 31 | c3:Out0 -> c7:In1 [label="32"]; 32 | c0:Out3 -> c8:In0 [label="32"]; 33 | c4:Out0 -> c8:In1 [label="32"]; 34 | c5:Out0 -> c9:In0 [label="32"]; 35 | c6:Out0 -> c9:In1 [label="32"]; 36 | c7:Out0 -> c10:In0 [label="32"]; 37 | c8:Out0 -> c10:In1 [label="32"]; 38 | c9:Out0 -> c11:In0 [label="32"]; 39 | c10:Out0 -> c11:In1 [label="32"]; 40 | c11:Out0 -> c12:In0 [label="32"]; 41 | } 42 | -------------------------------------------------------------------------------- /dots/evalPoly-rt4.dot: -------------------------------------------------------------------------------- 1 | digraph evalPoly_rt4 { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | bgcolor=transparent; 5 | nslimit=20; 6 | ranksep="2"; 7 | c1 [label="{{|}|+|{}}"]; 8 | c2 [label="{{|}|+|{}}"]; 9 | c3 [label="{{|}|+|{}}"]; 10 | c4 [label="{{|}|+|{}}"]; 11 | c5 [label="{{|}|+|{}}"]; 12 | c6 [label="{{|}|+|{}}"]; 13 | c7 [label="{{|}|+|{}}"]; 14 | c8 [label="{{|}|+|{}}"]; 15 | c9 [label="{{|}|+|{}}"]; 16 | c10 [label="{{|}|+|{}}"]; 17 | c11 [label="{{|}|+|{}}"]; 18 | c12 [label="{{|}|+|{}}"]; 19 | c13 [label="{{|}|+|{}}"]; 20 | c14 [label="{{|}|+|{}}"]; 21 | c15 [label="{{|}|+|{}}"]; 22 | c17 [label="{In|{||||||||||||||||}}"]; 23 | c18 [label="{{}|Out}"]; 24 | c19 [label="{{|}|×|{}}"]; 25 | c20 [label="{{|}|×|{}}"]; 26 | c21 [label="{{|}|×|{}}"]; 27 | c22 [label="{{|}|×|{}}"]; 28 | c23 [label="{{|}|×|{}}"]; 29 | c24 [label="{{|}|×|{}}"]; 30 | c25 [label="{{|}|×|{}}"]; 31 | c26 [label="{{|}|×|{}}"]; 32 | c27 [label="{{|}|×|{}}"]; 33 | c28 [label="{{|}|×|{}}"]; 34 | c29 [label="{{|}|×|{}}"]; 35 | c30 [label="{{|}|×|{}}"]; 36 | c31 [label="{{|}|×|{}}"]; 37 | c32 [label="{{|}|×|{}}"]; 38 | c33 [label="{{|}|×|{}}"]; 39 | c34 [label="{{|}|×|{}}"]; 40 | c35 [label="{{|}|×|{}}"]; 41 | c36 [label="{{|}|×|{}}"]; 42 | c37 [label="{{|}|×|{}}"]; 43 | c38 [label="{{|}|×|{}}"]; 44 | c39 [label="{{|}|×|{}}"]; 45 | c40 [label="{{|}|×|{}}"]; 46 | c41 [label="{{|}|×|{}}"]; 47 | c42 [label="{{|}|×|{}}"]; 48 | c43 [label="{{|}|×|{}}"]; 49 | c44 [label="{{|}|×|{}}"]; 50 | c45 [label="{{|}|×|{}}"]; 51 | c46 [label="{{|}|×|{}}"]; 52 | c47 [label="{{|}|×|{}}"]; 53 | c17:Out0 -> c1:In0 [label=32,fontsize=10]; 54 | c19:Out0 -> c1:In1 [label=32,fontsize=10]; 55 | c20:Out0 -> c2:In0 [label=32,fontsize=10]; 56 | c21:Out0 -> c2:In1 [label=32,fontsize=10]; 57 | c22:Out0 -> c3:In0 [label=32,fontsize=10]; 58 | c23:Out0 -> c3:In1 [label=32,fontsize=10]; 59 | c24:Out0 -> c4:In0 [label=32,fontsize=10]; 60 | c25:Out0 -> c4:In1 [label=32,fontsize=10]; 61 | c26:Out0 -> c5:In0 [label=32,fontsize=10]; 62 | c27:Out0 -> c5:In1 [label=32,fontsize=10]; 63 | c28:Out0 -> c6:In0 [label=32,fontsize=10]; 64 | c29:Out0 -> c6:In1 [label=32,fontsize=10]; 65 | c30:Out0 -> c7:In0 [label=32,fontsize=10]; 66 | c31:Out0 -> c7:In1 [label=32,fontsize=10]; 67 | c32:Out0 -> c8:In0 [label=32,fontsize=10]; 68 | c33:Out0 -> c8:In1 [label=32,fontsize=10]; 69 | c1:Out0 -> c9:In0 [label=32,fontsize=10]; 70 | c2:Out0 -> c9:In1 [label=32,fontsize=10]; 71 | c9:Out0 -> c10:In0 [label=32,fontsize=10]; 72 | c11:Out0 -> c10:In1 [label=32,fontsize=10]; 73 | c3:Out0 -> c11:In0 [label=32,fontsize=10]; 74 | c4:Out0 -> c11:In1 [label=32,fontsize=10]; 75 | c10:Out0 -> c12:In0 [label=32,fontsize=10]; 76 | c14:Out0 -> c12:In1 [label=32,fontsize=10]; 77 | c5:Out0 -> c13:In0 [label=32,fontsize=10]; 78 | c6:Out0 -> c13:In1 [label=32,fontsize=10]; 79 | c13:Out0 -> c14:In0 [label=32,fontsize=10]; 80 | c15:Out0 -> c14:In1 [label=32,fontsize=10]; 81 | c7:Out0 -> c15:In0 [label=32,fontsize=10]; 82 | c8:Out0 -> c15:In1 [label=32,fontsize=10]; 83 | c12:Out0 -> c18:In0 [label=32,fontsize=10]; 84 | c17:Out1 -> c19:In0 [label=32,fontsize=10]; 85 | c17:Out16 -> c19:In1 [label=32,fontsize=10]; 86 | c17:Out2 -> c20:In0 [label=32,fontsize=10]; 87 | c34:Out0 -> c20:In1 [label=32,fontsize=10]; 88 | c17:Out3 -> c21:In0 [label=32,fontsize=10]; 89 | c35:Out0 -> c21:In1 [label=32,fontsize=10]; 90 | c17:Out4 -> c22:In0 [label=32,fontsize=10]; 91 | c38:Out0 -> c22:In1 [label=32,fontsize=10]; 92 | c17:Out5 -> c23:In0 [label=32,fontsize=10]; 93 | c36:Out0 -> c23:In1 [label=32,fontsize=10]; 94 | c17:Out6 -> c24:In0 [label=32,fontsize=10]; 95 | c39:Out0 -> c24:In1 [label=32,fontsize=10]; 96 | c17:Out7 -> c25:In0 [label=32,fontsize=10]; 97 | c41:Out0 -> c25:In1 [label=32,fontsize=10]; 98 | c17:Out8 -> c26:In0 [label=32,fontsize=10]; 99 | c43:Out0 -> c26:In1 [label=32,fontsize=10]; 100 | c17:Out9 -> c27:In0 [label=32,fontsize=10]; 101 | c37:Out0 -> c27:In1 [label=32,fontsize=10]; 102 | c17:Out10 -> c28:In0 [label=32,fontsize=10]; 103 | c40:Out0 -> c28:In1 [label=32,fontsize=10]; 104 | c17:Out11 -> c29:In0 [label=32,fontsize=10]; 105 | c42:Out0 -> c29:In1 [label=32,fontsize=10]; 106 | c17:Out12 -> c30:In0 [label=32,fontsize=10]; 107 | c44:Out0 -> c30:In1 [label=32,fontsize=10]; 108 | c17:Out13 -> c31:In0 [label=32,fontsize=10]; 109 | c45:Out0 -> c31:In1 [label=32,fontsize=10]; 110 | c17:Out14 -> c32:In0 [label=32,fontsize=10]; 111 | c46:Out0 -> c32:In1 [label=32,fontsize=10]; 112 | c17:Out15 -> c33:In0 [label=32,fontsize=10]; 113 | c47:Out0 -> c33:In1 [label=32,fontsize=10]; 114 | c17:Out16 -> c34:In0 [label=32,fontsize=10]; 115 | c17:Out16 -> c34:In1 [label=32,fontsize=10]; 116 | c17:Out16 -> c35:In0 [label=32,fontsize=10]; 117 | c34:Out0 -> c35:In1 [label=32,fontsize=10]; 118 | c17:Out16 -> c36:In0 [label=32,fontsize=10]; 119 | c38:Out0 -> c36:In1 [label=32,fontsize=10]; 120 | c17:Out16 -> c37:In0 [label=32,fontsize=10]; 121 | c43:Out0 -> c37:In1 [label=32,fontsize=10]; 122 | c34:Out0 -> c38:In0 [label=32,fontsize=10]; 123 | c34:Out0 -> c38:In1 [label=32,fontsize=10]; 124 | c34:Out0 -> c39:In0 [label=32,fontsize=10]; 125 | c38:Out0 -> c39:In1 [label=32,fontsize=10]; 126 | c34:Out0 -> c40:In0 [label=32,fontsize=10]; 127 | c43:Out0 -> c40:In1 [label=32,fontsize=10]; 128 | c35:Out0 -> c41:In0 [label=32,fontsize=10]; 129 | c38:Out0 -> c41:In1 [label=32,fontsize=10]; 130 | c35:Out0 -> c42:In0 [label=32,fontsize=10]; 131 | c43:Out0 -> c42:In1 [label=32,fontsize=10]; 132 | c38:Out0 -> c43:In0 [label=32,fontsize=10]; 133 | c38:Out0 -> c43:In1 [label=32,fontsize=10]; 134 | c38:Out0 -> c44:In0 [label=32,fontsize=10]; 135 | c43:Out0 -> c44:In1 [label=32,fontsize=10]; 136 | c36:Out0 -> c45:In0 [label=32,fontsize=10]; 137 | c43:Out0 -> c45:In1 [label=32,fontsize=10]; 138 | c39:Out0 -> c46:In0 [label=32,fontsize=10]; 139 | c43:Out0 -> c46:In1 [label=32,fontsize=10]; 140 | c41:Out0 -> c47:In0 [label=32,fontsize=10]; 141 | c43:Out0 -> c47:In1 [label=32,fontsize=10]; 142 | } 143 | 144 | // Components: 15 +, 29 ×, 44 total. Max depth: 9. 145 | -------------------------------------------------------------------------------- /dots/fibS.dot: -------------------------------------------------------------------------------- 1 | digraph fibS { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | bgcolor=transparent; 5 | c0 [label="{{|}|+|{}}"]; 6 | c1 [label="{{}|Cons 0|{}}"]; 7 | c2 [label="{{}|Cons 1|{}}"]; 8 | c5 [label="{{}|Out}"]; 9 | c1:Out0 -> c0:In0 [label=32,fontsize=10]; 10 | c2:Out0 -> c0:In1 [label=32,fontsize=10]; 11 | c2:Out0 -> c1:In0 [label=32,fontsize=10]; 12 | c0:Out0 -> c2:In0 [label=32,fontsize=10]; 13 | c1:Out0 -> c5:In0 [label=32,fontsize=10]; 14 | } 15 | 16 | // Components: 1 +, 1 Cons 0, 1 Cons 1, 3 total. Depth: 1. 17 | -------------------------------------------------------------------------------- /dots/lsumsp-lt4.dot: -------------------------------------------------------------------------------- 1 | digraph { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | // ratio=1; 5 | ranksep=1.5; 6 | c0 [label="{In|{|||||||||||||||}}"]; 7 | c1 [label="{{|}|+|{}}"]; 8 | c2 [label="{{|}|+|{}}"]; 9 | c3 [label="{{|}|+|{}}"]; 10 | c4 [label="{{|}|+|{}}"]; 11 | c5 [label="{{|}|+|{}}"]; 12 | c6 [label="{{|}|+|{}}"]; 13 | c7 [label="{{|}|+|{}}"]; 14 | c8 [label="{{|}|+|{}}"]; 15 | c9 [label="{{|}|+|{}}"]; 16 | c10 [label="{{|}|+|{}}"]; 17 | c11 [label="{{|}|+|{}}"]; 18 | c12 [label="{{|}|+|{}}"]; 19 | c13 [label="{{|}|+|{}}"]; 20 | c14 [label="{{|}|+|{}}"]; 21 | c15 [label="{{|}|+|{}}"]; 22 | c16 [label="{{|}|+|{}}"]; 23 | c17 [label="{{|}|+|{}}"]; 24 | c18 [label="{{|}|+|{}}"]; 25 | c19 [label="{{|}|+|{}}"]; 26 | c20 [label="{{|}|+|{}}"]; 27 | c21 [label="{{|}|+|{}}"]; 28 | c22 [label="{{|}|+|{}}"]; 29 | c23 [label="{{|}|+|{}}"]; 30 | c24 [label="{{|}|+|{}}"]; 31 | c25 [label="{{|}|+|{}}"]; 32 | c26 [label="{{|}|+|{}}"]; 33 | c27 [label="{{|||||||||||||||}|Out}"]; 34 | c0:Out0 -> c1:In0 [label="32",fontsize=10]; 35 | c0:Out1 -> c1:In1 [label="32",fontsize=10]; 36 | c0:Out2 -> c2:In0 [label="32",fontsize=10]; 37 | c0:Out3 -> c2:In1 [label="32",fontsize=10]; 38 | c0:Out4 -> c3:In0 [label="32",fontsize=10]; 39 | c0:Out5 -> c3:In1 [label="32",fontsize=10]; 40 | c0:Out6 -> c4:In0 [label="32",fontsize=10]; 41 | c0:Out7 -> c4:In1 [label="32",fontsize=10]; 42 | c0:Out8 -> c5:In0 [label="32",fontsize=10]; 43 | c0:Out9 -> c5:In1 [label="32",fontsize=10]; 44 | c0:Out10 -> c6:In0 [label="32",fontsize=10]; 45 | c0:Out11 -> c6:In1 [label="32",fontsize=10]; 46 | c0:Out12 -> c7:In0 [label="32",fontsize=10]; 47 | c0:Out13 -> c7:In1 [label="32",fontsize=10]; 48 | c0:Out14 -> c8:In0 [label="32",fontsize=10]; 49 | c0:Out15 -> c8:In1 [label="32",fontsize=10]; 50 | c1:Out0 -> c9:In0 [label="32",fontsize=10]; 51 | c2:Out0 -> c9:In1 [label="32",fontsize=10]; 52 | c3:Out0 -> c10:In0 [label="32",fontsize=10]; 53 | c4:Out0 -> c10:In1 [label="32",fontsize=10]; 54 | c5:Out0 -> c11:In0 [label="32",fontsize=10]; 55 | c6:Out0 -> c11:In1 [label="32",fontsize=10]; 56 | c7:Out0 -> c12:In0 [label="32",fontsize=10]; 57 | c8:Out0 -> c12:In1 [label="32",fontsize=10]; 58 | c9:Out0 -> c13:In0 [label="32",fontsize=10]; 59 | c10:Out0 -> c13:In1 [label="32",fontsize=10]; 60 | c11:Out0 -> c14:In0 [label="32",fontsize=10]; 61 | c12:Out0 -> c14:In1 [label="32",fontsize=10]; 62 | c13:Out0 -> c15:In0 [label="32",fontsize=10]; 63 | c14:Out0 -> c15:In1 [label="32",fontsize=10]; 64 | c13:Out0 -> c16:In0 [label="32",fontsize=10]; 65 | c11:Out0 -> c16:In1 [label="32",fontsize=10]; 66 | c9:Out0 -> c17:In0 [label="32",fontsize=10]; 67 | c3:Out0 -> c17:In1 [label="32",fontsize=10]; 68 | c13:Out0 -> c18:In0 [label="32",fontsize=10]; 69 | c5:Out0 -> c18:In1 [label="32",fontsize=10]; 70 | c16:Out0 -> c19:In0 [label="32",fontsize=10]; 71 | c7:Out0 -> c19:In1 [label="32",fontsize=10]; 72 | c1:Out0 -> c20:In0 [label="32",fontsize=10]; 73 | c0:Out2 -> c20:In1 [label="32",fontsize=10]; 74 | c9:Out0 -> c21:In0 [label="32",fontsize=10]; 75 | c0:Out4 -> c21:In1 [label="32",fontsize=10]; 76 | c17:Out0 -> c22:In0 [label="32",fontsize=10]; 77 | c0:Out6 -> c22:In1 [label="32",fontsize=10]; 78 | c13:Out0 -> c23:In0 [label="32",fontsize=10]; 79 | c0:Out8 -> c23:In1 [label="32",fontsize=10]; 80 | c18:Out0 -> c24:In0 [label="32",fontsize=10]; 81 | c0:Out10 -> c24:In1 [label="32",fontsize=10]; 82 | c16:Out0 -> c25:In0 [label="32",fontsize=10]; 83 | c0:Out12 -> c25:In1 [label="32",fontsize=10]; 84 | c19:Out0 -> c26:In0 [label="32",fontsize=10]; 85 | c0:Out14 -> c26:In1 [label="32",fontsize=10]; 86 | c0:Out0 -> c27:In0 [label="32",fontsize=10]; 87 | c1:Out0 -> c27:In1 [label="32",fontsize=10]; 88 | c20:Out0 -> c27:In2 [label="32",fontsize=10]; 89 | c9:Out0 -> c27:In3 [label="32",fontsize=10]; 90 | c21:Out0 -> c27:In4 [label="32",fontsize=10]; 91 | c17:Out0 -> c27:In5 [label="32",fontsize=10]; 92 | c22:Out0 -> c27:In6 [label="32",fontsize=10]; 93 | c13:Out0 -> c27:In7 [label="32",fontsize=10]; 94 | c23:Out0 -> c27:In8 [label="32",fontsize=10]; 95 | c18:Out0 -> c27:In9 [label="32",fontsize=10]; 96 | c24:Out0 -> c27:In10 [label="32",fontsize=10]; 97 | c16:Out0 -> c27:In11 [label="32",fontsize=10]; 98 | c25:Out0 -> c27:In12 [label="32",fontsize=10]; 99 | c19:Out0 -> c27:In13 [label="32",fontsize=10]; 100 | c26:Out0 -> c27:In14 [label="32",fontsize=10]; 101 | c15:Out0 -> c27:In15 [label="32",fontsize=10]; 102 | } 103 | -------------------------------------------------------------------------------- /dots/lsumsp-rt4.dot: -------------------------------------------------------------------------------- 1 | digraph { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | // ratio=1; 5 | ranksep=1.5; 6 | c0 [label="{In|{|||||||||||||||}}"]; 7 | c1 [label="{{|}|+|{}}"]; 8 | c2 [label="{{|}|+|{}}"]; 9 | c3 [label="{{|}|+|{}}"]; 10 | c4 [label="{{|}|+|{}}"]; 11 | c5 [label="{{|}|+|{}}"]; 12 | c6 [label="{{|}|+|{}}"]; 13 | c7 [label="{{|}|+|{}}"]; 14 | c8 [label="{{|}|+|{}}"]; 15 | c9 [label="{{|}|+|{}}"]; 16 | c10 [label="{{|}|+|{}}"]; 17 | c11 [label="{{|}|+|{}}"]; 18 | c12 [label="{{|}|+|{}}"]; 19 | c13 [label="{{|}|+|{}}"]; 20 | c14 [label="{{|}|+|{}}"]; 21 | c15 [label="{{|}|+|{}}"]; 22 | c16 [label="{{|}|+|{}}"]; 23 | c17 [label="{{|}|+|{}}"]; 24 | c18 [label="{{|}|+|{}}"]; 25 | c19 [label="{{|}|+|{}}"]; 26 | c20 [label="{{|}|+|{}}"]; 27 | c21 [label="{{|}|+|{}}"]; 28 | c22 [label="{{|}|+|{}}"]; 29 | c23 [label="{{|}|+|{}}"]; 30 | c24 [label="{{|}|+|{}}"]; 31 | c25 [label="{{|}|+|{}}"]; 32 | c26 [label="{{|}|+|{}}"]; 33 | c27 [label="{{|}|+|{}}"]; 34 | c28 [label="{{|}|+|{}}"]; 35 | c29 [label="{{|}|+|{}}"]; 36 | c30 [label="{{|}|+|{}}"]; 37 | c31 [label="{{|}|+|{}}"]; 38 | c32 [label="{{|}|+|{}}"]; 39 | c33 [label="{{|||||||||||||||}|Out}"]; 40 | c0:Out0 -> c1:In0 [label="32",fontsize=10]; 41 | c0:Out1 -> c1:In1 [label="32",fontsize=10]; 42 | c0:Out2 -> c2:In0 [label="32",fontsize=10]; 43 | c0:Out3 -> c2:In1 [label="32",fontsize=10]; 44 | c1:Out0 -> c3:In0 [label="32",fontsize=10]; 45 | c0:Out2 -> c3:In1 [label="32",fontsize=10]; 46 | c1:Out0 -> c4:In0 [label="32",fontsize=10]; 47 | c2:Out0 -> c4:In1 [label="32",fontsize=10]; 48 | c0:Out4 -> c5:In0 [label="32",fontsize=10]; 49 | c0:Out5 -> c5:In1 [label="32",fontsize=10]; 50 | c0:Out6 -> c6:In0 [label="32",fontsize=10]; 51 | c0:Out7 -> c6:In1 [label="32",fontsize=10]; 52 | c5:Out0 -> c7:In0 [label="32",fontsize=10]; 53 | c0:Out6 -> c7:In1 [label="32",fontsize=10]; 54 | c5:Out0 -> c8:In0 [label="32",fontsize=10]; 55 | c6:Out0 -> c8:In1 [label="32",fontsize=10]; 56 | c4:Out0 -> c9:In0 [label="32",fontsize=10]; 57 | c0:Out4 -> c9:In1 [label="32",fontsize=10]; 58 | c4:Out0 -> c10:In0 [label="32",fontsize=10]; 59 | c5:Out0 -> c10:In1 [label="32",fontsize=10]; 60 | c4:Out0 -> c11:In0 [label="32",fontsize=10]; 61 | c7:Out0 -> c11:In1 [label="32",fontsize=10]; 62 | c4:Out0 -> c12:In0 [label="32",fontsize=10]; 63 | c8:Out0 -> c12:In1 [label="32",fontsize=10]; 64 | c0:Out8 -> c13:In0 [label="32",fontsize=10]; 65 | c0:Out9 -> c13:In1 [label="32",fontsize=10]; 66 | c0:Out10 -> c14:In0 [label="32",fontsize=10]; 67 | c0:Out11 -> c14:In1 [label="32",fontsize=10]; 68 | c13:Out0 -> c15:In0 [label="32",fontsize=10]; 69 | c0:Out10 -> c15:In1 [label="32",fontsize=10]; 70 | c13:Out0 -> c16:In0 [label="32",fontsize=10]; 71 | c14:Out0 -> c16:In1 [label="32",fontsize=10]; 72 | c0:Out12 -> c17:In0 [label="32",fontsize=10]; 73 | c0:Out13 -> c17:In1 [label="32",fontsize=10]; 74 | c0:Out14 -> c18:In0 [label="32",fontsize=10]; 75 | c0:Out15 -> c18:In1 [label="32",fontsize=10]; 76 | c17:Out0 -> c19:In0 [label="32",fontsize=10]; 77 | c0:Out14 -> c19:In1 [label="32",fontsize=10]; 78 | c17:Out0 -> c20:In0 [label="32",fontsize=10]; 79 | c18:Out0 -> c20:In1 [label="32",fontsize=10]; 80 | c16:Out0 -> c21:In0 [label="32",fontsize=10]; 81 | c0:Out12 -> c21:In1 [label="32",fontsize=10]; 82 | c16:Out0 -> c22:In0 [label="32",fontsize=10]; 83 | c17:Out0 -> c22:In1 [label="32",fontsize=10]; 84 | c16:Out0 -> c23:In0 [label="32",fontsize=10]; 85 | c19:Out0 -> c23:In1 [label="32",fontsize=10]; 86 | c16:Out0 -> c24:In0 [label="32",fontsize=10]; 87 | c20:Out0 -> c24:In1 [label="32",fontsize=10]; 88 | c12:Out0 -> c25:In0 [label="32",fontsize=10]; 89 | c0:Out8 -> c25:In1 [label="32",fontsize=10]; 90 | c12:Out0 -> c26:In0 [label="32",fontsize=10]; 91 | c13:Out0 -> c26:In1 [label="32",fontsize=10]; 92 | c12:Out0 -> c27:In0 [label="32",fontsize=10]; 93 | c15:Out0 -> c27:In1 [label="32",fontsize=10]; 94 | c12:Out0 -> c28:In0 [label="32",fontsize=10]; 95 | c16:Out0 -> c28:In1 [label="32",fontsize=10]; 96 | c12:Out0 -> c29:In0 [label="32",fontsize=10]; 97 | c21:Out0 -> c29:In1 [label="32",fontsize=10]; 98 | c12:Out0 -> c30:In0 [label="32",fontsize=10]; 99 | c22:Out0 -> c30:In1 [label="32",fontsize=10]; 100 | c12:Out0 -> c31:In0 [label="32",fontsize=10]; 101 | c23:Out0 -> c31:In1 [label="32",fontsize=10]; 102 | c12:Out0 -> c32:In0 [label="32",fontsize=10]; 103 | c24:Out0 -> c32:In1 [label="32",fontsize=10]; 104 | c0:Out0 -> c33:In0 [label="32",fontsize=10]; 105 | c1:Out0 -> c33:In1 [label="32",fontsize=10]; 106 | c3:Out0 -> c33:In2 [label="32",fontsize=10]; 107 | c4:Out0 -> c33:In3 [label="32",fontsize=10]; 108 | c9:Out0 -> c33:In4 [label="32",fontsize=10]; 109 | c10:Out0 -> c33:In5 [label="32",fontsize=10]; 110 | c11:Out0 -> c33:In6 [label="32",fontsize=10]; 111 | c12:Out0 -> c33:In7 [label="32",fontsize=10]; 112 | c25:Out0 -> c33:In8 [label="32",fontsize=10]; 113 | c26:Out0 -> c33:In9 [label="32",fontsize=10]; 114 | c27:Out0 -> c33:In10 [label="32",fontsize=10]; 115 | c28:Out0 -> c33:In11 [label="32",fontsize=10]; 116 | c29:Out0 -> c33:In12 [label="32",fontsize=10]; 117 | c30:Out0 -> c33:In13 [label="32",fontsize=10]; 118 | c31:Out0 -> c33:In14 [label="32",fontsize=10]; 119 | c32:Out0 -> c33:In15 [label="32",fontsize=10]; 120 | } 121 | -------------------------------------------------------------------------------- /dots/lsumsp-rt5.dot: -------------------------------------------------------------------------------- 1 | digraph { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | // ratio=1; 5 | ranksep=2.5; 6 | c0 [label="{In|{|||||||||||||||||||||||||||||||}}"]; 7 | c1 [label="{{|}|+|{}}"]; 8 | c2 [label="{{|}|+|{}}"]; 9 | c3 [label="{{|}|+|{}}"]; 10 | c4 [label="{{|}|+|{}}"]; 11 | c5 [label="{{|}|+|{}}"]; 12 | c6 [label="{{|}|+|{}}"]; 13 | c7 [label="{{|}|+|{}}"]; 14 | c8 [label="{{|}|+|{}}"]; 15 | c9 [label="{{|}|+|{}}"]; 16 | c10 [label="{{|}|+|{}}"]; 17 | c11 [label="{{|}|+|{}}"]; 18 | c12 [label="{{|}|+|{}}"]; 19 | c13 [label="{{|}|+|{}}"]; 20 | c14 [label="{{|}|+|{}}"]; 21 | c15 [label="{{|}|+|{}}"]; 22 | c16 [label="{{|}|+|{}}"]; 23 | c17 [label="{{|}|+|{}}"]; 24 | c18 [label="{{|}|+|{}}"]; 25 | c19 [label="{{|}|+|{}}"]; 26 | c20 [label="{{|}|+|{}}"]; 27 | c21 [label="{{|}|+|{}}"]; 28 | c22 [label="{{|}|+|{}}"]; 29 | c23 [label="{{|}|+|{}}"]; 30 | c24 [label="{{|}|+|{}}"]; 31 | c25 [label="{{|}|+|{}}"]; 32 | c26 [label="{{|}|+|{}}"]; 33 | c27 [label="{{|}|+|{}}"]; 34 | c28 [label="{{|}|+|{}}"]; 35 | c29 [label="{{|}|+|{}}"]; 36 | c30 [label="{{|}|+|{}}"]; 37 | c31 [label="{{|}|+|{}}"]; 38 | c32 [label="{{|}|+|{}}"]; 39 | c33 [label="{{|}|+|{}}"]; 40 | c34 [label="{{|}|+|{}}"]; 41 | c35 [label="{{|}|+|{}}"]; 42 | c36 [label="{{|}|+|{}}"]; 43 | c37 [label="{{|}|+|{}}"]; 44 | c38 [label="{{|}|+|{}}"]; 45 | c39 [label="{{|}|+|{}}"]; 46 | c40 [label="{{|}|+|{}}"]; 47 | c41 [label="{{|}|+|{}}"]; 48 | c42 [label="{{|}|+|{}}"]; 49 | c43 [label="{{|}|+|{}}"]; 50 | c44 [label="{{|}|+|{}}"]; 51 | c45 [label="{{|}|+|{}}"]; 52 | c46 [label="{{|}|+|{}}"]; 53 | c47 [label="{{|}|+|{}}"]; 54 | c48 [label="{{|}|+|{}}"]; 55 | c49 [label="{{|}|+|{}}"]; 56 | c50 [label="{{|}|+|{}}"]; 57 | c51 [label="{{|}|+|{}}"]; 58 | c52 [label="{{|}|+|{}}"]; 59 | c53 [label="{{|}|+|{}}"]; 60 | c54 [label="{{|}|+|{}}"]; 61 | c55 [label="{{|}|+|{}}"]; 62 | c56 [label="{{|}|+|{}}"]; 63 | c57 [label="{{|}|+|{}}"]; 64 | c58 [label="{{|}|+|{}}"]; 65 | c59 [label="{{|}|+|{}}"]; 66 | c60 [label="{{|}|+|{}}"]; 67 | c61 [label="{{|}|+|{}}"]; 68 | c62 [label="{{|}|+|{}}"]; 69 | c63 [label="{{|}|+|{}}"]; 70 | c64 [label="{{|}|+|{}}"]; 71 | c65 [label="{{|}|+|{}}"]; 72 | c66 [label="{{|}|+|{}}"]; 73 | c67 [label="{{|}|+|{}}"]; 74 | c68 [label="{{|}|+|{}}"]; 75 | c69 [label="{{|}|+|{}}"]; 76 | c70 [label="{{|}|+|{}}"]; 77 | c71 [label="{{|}|+|{}}"]; 78 | c72 [label="{{|}|+|{}}"]; 79 | c73 [label="{{|}|+|{}}"]; 80 | c74 [label="{{|}|+|{}}"]; 81 | c75 [label="{{|}|+|{}}"]; 82 | c76 [label="{{|}|+|{}}"]; 83 | c77 [label="{{|}|+|{}}"]; 84 | c78 [label="{{|}|+|{}}"]; 85 | c79 [label="{{|}|+|{}}"]; 86 | c80 [label="{{|}|+|{}}"]; 87 | c81 [label="{{|||||||||||||||||||||||||||||||}|Out}"]; 88 | c0:Out0 -> c1:In0 [label="32",fontsize=10]; 89 | c0:Out1 -> c1:In1 [label="32",fontsize=10]; 90 | c0:Out2 -> c2:In0 [label="32",fontsize=10]; 91 | c0:Out3 -> c2:In1 [label="32",fontsize=10]; 92 | c1:Out0 -> c3:In0 [label="32",fontsize=10]; 93 | c0:Out2 -> c3:In1 [label="32",fontsize=10]; 94 | c1:Out0 -> c4:In0 [label="32",fontsize=10]; 95 | c2:Out0 -> c4:In1 [label="32",fontsize=10]; 96 | c0:Out4 -> c5:In0 [label="32",fontsize=10]; 97 | c0:Out5 -> c5:In1 [label="32",fontsize=10]; 98 | c0:Out6 -> c6:In0 [label="32",fontsize=10]; 99 | c0:Out7 -> c6:In1 [label="32",fontsize=10]; 100 | c5:Out0 -> c7:In0 [label="32",fontsize=10]; 101 | c0:Out6 -> c7:In1 [label="32",fontsize=10]; 102 | c5:Out0 -> c8:In0 [label="32",fontsize=10]; 103 | c6:Out0 -> c8:In1 [label="32",fontsize=10]; 104 | c4:Out0 -> c9:In0 [label="32",fontsize=10]; 105 | c0:Out4 -> c9:In1 [label="32",fontsize=10]; 106 | c4:Out0 -> c10:In0 [label="32",fontsize=10]; 107 | c5:Out0 -> c10:In1 [label="32",fontsize=10]; 108 | c4:Out0 -> c11:In0 [label="32",fontsize=10]; 109 | c7:Out0 -> c11:In1 [label="32",fontsize=10]; 110 | c4:Out0 -> c12:In0 [label="32",fontsize=10]; 111 | c8:Out0 -> c12:In1 [label="32",fontsize=10]; 112 | c0:Out8 -> c13:In0 [label="32",fontsize=10]; 113 | c0:Out9 -> c13:In1 [label="32",fontsize=10]; 114 | c0:Out10 -> c14:In0 [label="32",fontsize=10]; 115 | c0:Out11 -> c14:In1 [label="32",fontsize=10]; 116 | c13:Out0 -> c15:In0 [label="32",fontsize=10]; 117 | c0:Out10 -> c15:In1 [label="32",fontsize=10]; 118 | c13:Out0 -> c16:In0 [label="32",fontsize=10]; 119 | c14:Out0 -> c16:In1 [label="32",fontsize=10]; 120 | c0:Out12 -> c17:In0 [label="32",fontsize=10]; 121 | c0:Out13 -> c17:In1 [label="32",fontsize=10]; 122 | c0:Out14 -> c18:In0 [label="32",fontsize=10]; 123 | c0:Out15 -> c18:In1 [label="32",fontsize=10]; 124 | c17:Out0 -> c19:In0 [label="32",fontsize=10]; 125 | c0:Out14 -> c19:In1 [label="32",fontsize=10]; 126 | c17:Out0 -> c20:In0 [label="32",fontsize=10]; 127 | c18:Out0 -> c20:In1 [label="32",fontsize=10]; 128 | c16:Out0 -> c21:In0 [label="32",fontsize=10]; 129 | c0:Out12 -> c21:In1 [label="32",fontsize=10]; 130 | c16:Out0 -> c22:In0 [label="32",fontsize=10]; 131 | c17:Out0 -> c22:In1 [label="32",fontsize=10]; 132 | c16:Out0 -> c23:In0 [label="32",fontsize=10]; 133 | c19:Out0 -> c23:In1 [label="32",fontsize=10]; 134 | c16:Out0 -> c24:In0 [label="32",fontsize=10]; 135 | c20:Out0 -> c24:In1 [label="32",fontsize=10]; 136 | c12:Out0 -> c25:In0 [label="32",fontsize=10]; 137 | c0:Out8 -> c25:In1 [label="32",fontsize=10]; 138 | c12:Out0 -> c26:In0 [label="32",fontsize=10]; 139 | c13:Out0 -> c26:In1 [label="32",fontsize=10]; 140 | c12:Out0 -> c27:In0 [label="32",fontsize=10]; 141 | c15:Out0 -> c27:In1 [label="32",fontsize=10]; 142 | c12:Out0 -> c28:In0 [label="32",fontsize=10]; 143 | c16:Out0 -> c28:In1 [label="32",fontsize=10]; 144 | c12:Out0 -> c29:In0 [label="32",fontsize=10]; 145 | c21:Out0 -> c29:In1 [label="32",fontsize=10]; 146 | c12:Out0 -> c30:In0 [label="32",fontsize=10]; 147 | c22:Out0 -> c30:In1 [label="32",fontsize=10]; 148 | c12:Out0 -> c31:In0 [label="32",fontsize=10]; 149 | c23:Out0 -> c31:In1 [label="32",fontsize=10]; 150 | c12:Out0 -> c32:In0 [label="32",fontsize=10]; 151 | c24:Out0 -> c32:In1 [label="32",fontsize=10]; 152 | c0:Out16 -> c33:In0 [label="32",fontsize=10]; 153 | c0:Out17 -> c33:In1 [label="32",fontsize=10]; 154 | c0:Out18 -> c34:In0 [label="32",fontsize=10]; 155 | c0:Out19 -> c34:In1 [label="32",fontsize=10]; 156 | c33:Out0 -> c35:In0 [label="32",fontsize=10]; 157 | c0:Out18 -> c35:In1 [label="32",fontsize=10]; 158 | c33:Out0 -> c36:In0 [label="32",fontsize=10]; 159 | c34:Out0 -> c36:In1 [label="32",fontsize=10]; 160 | c0:Out20 -> c37:In0 [label="32",fontsize=10]; 161 | c0:Out21 -> c37:In1 [label="32",fontsize=10]; 162 | c0:Out22 -> c38:In0 [label="32",fontsize=10]; 163 | c0:Out23 -> c38:In1 [label="32",fontsize=10]; 164 | c37:Out0 -> c39:In0 [label="32",fontsize=10]; 165 | c0:Out22 -> c39:In1 [label="32",fontsize=10]; 166 | c37:Out0 -> c40:In0 [label="32",fontsize=10]; 167 | c38:Out0 -> c40:In1 [label="32",fontsize=10]; 168 | c36:Out0 -> c41:In0 [label="32",fontsize=10]; 169 | c0:Out20 -> c41:In1 [label="32",fontsize=10]; 170 | c36:Out0 -> c42:In0 [label="32",fontsize=10]; 171 | c37:Out0 -> c42:In1 [label="32",fontsize=10]; 172 | c36:Out0 -> c43:In0 [label="32",fontsize=10]; 173 | c39:Out0 -> c43:In1 [label="32",fontsize=10]; 174 | c36:Out0 -> c44:In0 [label="32",fontsize=10]; 175 | c40:Out0 -> c44:In1 [label="32",fontsize=10]; 176 | c0:Out24 -> c45:In0 [label="32",fontsize=10]; 177 | c0:Out25 -> c45:In1 [label="32",fontsize=10]; 178 | c0:Out26 -> c46:In0 [label="32",fontsize=10]; 179 | c0:Out27 -> c46:In1 [label="32",fontsize=10]; 180 | c45:Out0 -> c47:In0 [label="32",fontsize=10]; 181 | c0:Out26 -> c47:In1 [label="32",fontsize=10]; 182 | c45:Out0 -> c48:In0 [label="32",fontsize=10]; 183 | c46:Out0 -> c48:In1 [label="32",fontsize=10]; 184 | c0:Out28 -> c49:In0 [label="32",fontsize=10]; 185 | c0:Out29 -> c49:In1 [label="32",fontsize=10]; 186 | c0:Out30 -> c50:In0 [label="32",fontsize=10]; 187 | c0:Out31 -> c50:In1 [label="32",fontsize=10]; 188 | c49:Out0 -> c51:In0 [label="32",fontsize=10]; 189 | c0:Out30 -> c51:In1 [label="32",fontsize=10]; 190 | c49:Out0 -> c52:In0 [label="32",fontsize=10]; 191 | c50:Out0 -> c52:In1 [label="32",fontsize=10]; 192 | c48:Out0 -> c53:In0 [label="32",fontsize=10]; 193 | c0:Out28 -> c53:In1 [label="32",fontsize=10]; 194 | c48:Out0 -> c54:In0 [label="32",fontsize=10]; 195 | c49:Out0 -> c54:In1 [label="32",fontsize=10]; 196 | c48:Out0 -> c55:In0 [label="32",fontsize=10]; 197 | c51:Out0 -> c55:In1 [label="32",fontsize=10]; 198 | c48:Out0 -> c56:In0 [label="32",fontsize=10]; 199 | c52:Out0 -> c56:In1 [label="32",fontsize=10]; 200 | c44:Out0 -> c57:In0 [label="32",fontsize=10]; 201 | c0:Out24 -> c57:In1 [label="32",fontsize=10]; 202 | c44:Out0 -> c58:In0 [label="32",fontsize=10]; 203 | c45:Out0 -> c58:In1 [label="32",fontsize=10]; 204 | c44:Out0 -> c59:In0 [label="32",fontsize=10]; 205 | c47:Out0 -> c59:In1 [label="32",fontsize=10]; 206 | c44:Out0 -> c60:In0 [label="32",fontsize=10]; 207 | c48:Out0 -> c60:In1 [label="32",fontsize=10]; 208 | c44:Out0 -> c61:In0 [label="32",fontsize=10]; 209 | c53:Out0 -> c61:In1 [label="32",fontsize=10]; 210 | c44:Out0 -> c62:In0 [label="32",fontsize=10]; 211 | c54:Out0 -> c62:In1 [label="32",fontsize=10]; 212 | c44:Out0 -> c63:In0 [label="32",fontsize=10]; 213 | c55:Out0 -> c63:In1 [label="32",fontsize=10]; 214 | c44:Out0 -> c64:In0 [label="32",fontsize=10]; 215 | c56:Out0 -> c64:In1 [label="32",fontsize=10]; 216 | c32:Out0 -> c65:In0 [label="32",fontsize=10]; 217 | c0:Out16 -> c65:In1 [label="32",fontsize=10]; 218 | c32:Out0 -> c66:In0 [label="32",fontsize=10]; 219 | c33:Out0 -> c66:In1 [label="32",fontsize=10]; 220 | c32:Out0 -> c67:In0 [label="32",fontsize=10]; 221 | c35:Out0 -> c67:In1 [label="32",fontsize=10]; 222 | c32:Out0 -> c68:In0 [label="32",fontsize=10]; 223 | c36:Out0 -> c68:In1 [label="32",fontsize=10]; 224 | c32:Out0 -> c69:In0 [label="32",fontsize=10]; 225 | c41:Out0 -> c69:In1 [label="32",fontsize=10]; 226 | c32:Out0 -> c70:In0 [label="32",fontsize=10]; 227 | c42:Out0 -> c70:In1 [label="32",fontsize=10]; 228 | c32:Out0 -> c71:In0 [label="32",fontsize=10]; 229 | c43:Out0 -> c71:In1 [label="32",fontsize=10]; 230 | c32:Out0 -> c72:In0 [label="32",fontsize=10]; 231 | c44:Out0 -> c72:In1 [label="32",fontsize=10]; 232 | c32:Out0 -> c73:In0 [label="32",fontsize=10]; 233 | c57:Out0 -> c73:In1 [label="32",fontsize=10]; 234 | c32:Out0 -> c74:In0 [label="32",fontsize=10]; 235 | c58:Out0 -> c74:In1 [label="32",fontsize=10]; 236 | c32:Out0 -> c75:In0 [label="32",fontsize=10]; 237 | c59:Out0 -> c75:In1 [label="32",fontsize=10]; 238 | c32:Out0 -> c76:In0 [label="32",fontsize=10]; 239 | c60:Out0 -> c76:In1 [label="32",fontsize=10]; 240 | c32:Out0 -> c77:In0 [label="32",fontsize=10]; 241 | c61:Out0 -> c77:In1 [label="32",fontsize=10]; 242 | c32:Out0 -> c78:In0 [label="32",fontsize=10]; 243 | c62:Out0 -> c78:In1 [label="32",fontsize=10]; 244 | c32:Out0 -> c79:In0 [label="32",fontsize=10]; 245 | c63:Out0 -> c79:In1 [label="32",fontsize=10]; 246 | c32:Out0 -> c80:In0 [label="32",fontsize=10]; 247 | c64:Out0 -> c80:In1 [label="32",fontsize=10]; 248 | c0:Out0 -> c81:In0 [label="32",fontsize=10]; 249 | c1:Out0 -> c81:In1 [label="32",fontsize=10]; 250 | c3:Out0 -> c81:In2 [label="32",fontsize=10]; 251 | c4:Out0 -> c81:In3 [label="32",fontsize=10]; 252 | c9:Out0 -> c81:In4 [label="32",fontsize=10]; 253 | c10:Out0 -> c81:In5 [label="32",fontsize=10]; 254 | c11:Out0 -> c81:In6 [label="32",fontsize=10]; 255 | c12:Out0 -> c81:In7 [label="32",fontsize=10]; 256 | c25:Out0 -> c81:In8 [label="32",fontsize=10]; 257 | c26:Out0 -> c81:In9 [label="32",fontsize=10]; 258 | c27:Out0 -> c81:In10 [label="32",fontsize=10]; 259 | c28:Out0 -> c81:In11 [label="32",fontsize=10]; 260 | c29:Out0 -> c81:In12 [label="32",fontsize=10]; 261 | c30:Out0 -> c81:In13 [label="32",fontsize=10]; 262 | c31:Out0 -> c81:In14 [label="32",fontsize=10]; 263 | c32:Out0 -> c81:In15 [label="32",fontsize=10]; 264 | c65:Out0 -> c81:In16 [label="32",fontsize=10]; 265 | c66:Out0 -> c81:In17 [label="32",fontsize=10]; 266 | c67:Out0 -> c81:In18 [label="32",fontsize=10]; 267 | c68:Out0 -> c81:In19 [label="32",fontsize=10]; 268 | c69:Out0 -> c81:In20 [label="32",fontsize=10]; 269 | c70:Out0 -> c81:In21 [label="32",fontsize=10]; 270 | c71:Out0 -> c81:In22 [label="32",fontsize=10]; 271 | c72:Out0 -> c81:In23 [label="32",fontsize=10]; 272 | c73:Out0 -> c81:In24 [label="32",fontsize=10]; 273 | c74:Out0 -> c81:In25 [label="32",fontsize=10]; 274 | c75:Out0 -> c81:In26 [label="32",fontsize=10]; 275 | c76:Out0 -> c81:In27 [label="32",fontsize=10]; 276 | c77:Out0 -> c81:In28 [label="32",fontsize=10]; 277 | c78:Out0 -> c81:In29 [label="32",fontsize=10]; 278 | c79:Out0 -> c81:In30 [label="32",fontsize=10]; 279 | c80:Out0 -> c81:In31 [label="32",fontsize=10]; 280 | } 281 | -------------------------------------------------------------------------------- /dots/map-t3.dot: -------------------------------------------------------------------------------- 1 | digraph map_t3 { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | bgcolor=transparent; 5 | c0 [label="{In|{|||||||}}"]; 6 | c2 [label="{{|||||||}|Out}"]; 7 | c4 [label="{{}|not|{}}"]; 8 | c5 [label="{{}|not|{}}"]; 9 | c6 [label="{{}|not|{}}"]; 10 | c7 [label="{{}|not|{}}"]; 11 | c8 [label="{{}|not|{}}"]; 12 | c9 [label="{{}|not|{}}"]; 13 | c10 [label="{{}|not|{}}"]; 14 | c11 [label="{{}|not|{}}"]; 15 | c4:Out0 -> c2:In0 []; 16 | c5:Out0 -> c2:In1 []; 17 | c6:Out0 -> c2:In2 []; 18 | c7:Out0 -> c2:In3 []; 19 | c8:Out0 -> c2:In4 []; 20 | c9:Out0 -> c2:In5 []; 21 | c10:Out0 -> c2:In6 []; 22 | c11:Out0 -> c2:In7 []; 23 | c0:Out0 -> c4:In0 []; 24 | c0:Out1 -> c5:In0 []; 25 | c0:Out2 -> c6:In0 []; 26 | c0:Out3 -> c7:In0 []; 27 | c0:Out4 -> c8:In0 []; 28 | c0:Out5 -> c9:In0 []; 29 | c0:Out6 -> c10:In0 []; 30 | c0:Out7 -> c11:In0 []; 31 | } 32 | 33 | // Components: 8 not. Depth: 1. 34 | -------------------------------------------------------------------------------- /dots/map-t4.dot: -------------------------------------------------------------------------------- 1 | digraph { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | // ratio=1; 5 | c0 [label="{In|{|||||||||||||||}}"]; 6 | c1 [label="{{}|not|{}}"]; 7 | c2 [label="{{}|not|{}}"]; 8 | c3 [label="{{}|not|{}}"]; 9 | c4 [label="{{}|not|{}}"]; 10 | c5 [label="{{}|not|{}}"]; 11 | c6 [label="{{}|not|{}}"]; 12 | c7 [label="{{}|not|{}}"]; 13 | c8 [label="{{}|not|{}}"]; 14 | c9 [label="{{}|not|{}}"]; 15 | c10 [label="{{}|not|{}}"]; 16 | c11 [label="{{}|not|{}}"]; 17 | c12 [label="{{}|not|{}}"]; 18 | c13 [label="{{}|not|{}}"]; 19 | c14 [label="{{}|not|{}}"]; 20 | c15 [label="{{}|not|{}}"]; 21 | c16 [label="{{}|not|{}}"]; 22 | c17 [label="{{|||||||||||||||}|Out}"]; 23 | c0:Out0 -> c1:In0 ; 24 | c0:Out1 -> c2:In0 ; 25 | c0:Out2 -> c3:In0 ; 26 | c0:Out3 -> c4:In0 ; 27 | c0:Out4 -> c5:In0 ; 28 | c0:Out5 -> c6:In0 ; 29 | c0:Out6 -> c7:In0 ; 30 | c0:Out7 -> c8:In0 ; 31 | c0:Out8 -> c9:In0 ; 32 | c0:Out9 -> c10:In0 ; 33 | c0:Out10 -> c11:In0 ; 34 | c0:Out11 -> c12:In0 ; 35 | c0:Out12 -> c13:In0 ; 36 | c0:Out13 -> c14:In0 ; 37 | c0:Out14 -> c15:In0 ; 38 | c0:Out15 -> c16:In0 ; 39 | c1:Out0 -> c17:In0 ; 40 | c2:Out0 -> c17:In1 ; 41 | c3:Out0 -> c17:In2 ; 42 | c4:Out0 -> c17:In3 ; 43 | c5:Out0 -> c17:In4 ; 44 | c6:Out0 -> c17:In5 ; 45 | c7:Out0 -> c17:In6 ; 46 | c8:Out0 -> c17:In7 ; 47 | c9:Out0 -> c17:In8 ; 48 | c10:Out0 -> c17:In9 ; 49 | c11:Out0 -> c17:In10 ; 50 | c12:Out0 -> c17:In11 ; 51 | c13:Out0 -> c17:In12 ; 52 | c14:Out0 -> c17:In13 ; 53 | c15:Out0 -> c17:In14 ; 54 | c16:Out0 -> c17:In15 ; 55 | } 56 | -------------------------------------------------------------------------------- /dots/map-v6.dot: -------------------------------------------------------------------------------- 1 | digraph { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | // ratio=1; 5 | c0 [label="{In|{|||||}}"]; 6 | c1 [label="{{}|not|{}}"]; 7 | c2 [label="{{}|not|{}}"]; 8 | c3 [label="{{}|not|{}}"]; 9 | c4 [label="{{}|not|{}}"]; 10 | c5 [label="{{}|not|{}}"]; 11 | c6 [label="{{}|not|{}}"]; 12 | c7 [label="{{|||||}|Out}"]; 13 | c0:Out0 -> c1:In0 ; 14 | c0:Out1 -> c2:In0 ; 15 | c0:Out2 -> c3:In0 ; 16 | c0:Out3 -> c4:In0 ; 17 | c0:Out4 -> c5:In0 ; 18 | c0:Out5 -> c6:In0 ; 19 | c1:Out0 -> c7:In0 ; 20 | c2:Out0 -> c7:In1 ; 21 | c3:Out0 -> c7:In2 ; 22 | c4:Out0 -> c7:In3 ; 23 | c5:Out0 -> c7:In4 ; 24 | c6:Out0 -> c7:In5 ; 25 | } 26 | -------------------------------------------------------------------------------- /dots/powers-rt4-no-opt.dot: -------------------------------------------------------------------------------- 1 | digraph powers_rt4_no_opt { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | bgcolor=transparent; 5 | nslimit=20; 6 | ranksep="3"; 7 | c1 [label="{1|{}}"]; 8 | c2 [label="{In|{}}"]; 9 | c3 [label="{{|||||||||||||||}|Out}"]; 10 | c4 [label="{{|}|×|{}}"]; 11 | c5 [label="{{|}|×|{}}"]; 12 | c6 [label="{{|}|×|{}}"]; 13 | c7 [label="{{|}|×|{}}"]; 14 | c8 [label="{{|}|×|{}}"]; 15 | c9 [label="{{|}|×|{}}"]; 16 | c10 [label="{{|}|×|{}}"]; 17 | c11 [label="{{|}|×|{}}"]; 18 | c12 [label="{{|}|×|{}}"]; 19 | c13 [label="{{|}|×|{}}"]; 20 | c14 [label="{{|}|×|{}}"]; 21 | c15 [label="{{|}|×|{}}"]; 22 | c16 [label="{{|}|×|{}}"]; 23 | c17 [label="{{|}|×|{}}"]; 24 | c18 [label="{{|}|×|{}}"]; 25 | c19 [label="{{|}|×|{}}"]; 26 | c20 [label="{{|}|×|{}}"]; 27 | c21 [label="{{|}|×|{}}"]; 28 | c22 [label="{{|}|×|{}}"]; 29 | c23 [label="{{|}|×|{}}"]; 30 | c24 [label="{{|}|×|{}}"]; 31 | c25 [label="{{|}|×|{}}"]; 32 | c26 [label="{{|}|×|{}}"]; 33 | c27 [label="{{|}|×|{}}"]; 34 | c28 [label="{{|}|×|{}}"]; 35 | c29 [label="{{|}|×|{}}"]; 36 | c30 [label="{{|}|×|{}}"]; 37 | c31 [label="{{|}|×|{}}"]; 38 | c32 [label="{{|}|×|{}}"]; 39 | c33 [label="{{|}|×|{}}"]; 40 | c34 [label="{{|}|×|{}}"]; 41 | c35 [label="{{|}|×|{}}"]; 42 | c36 [label="{{|}|×|{}}"]; 43 | c13:Out0 -> c3:In0 [label=32,fontsize=10]; 44 | c14:Out0 -> c3:In1 [label=32,fontsize=10]; 45 | c15:Out0 -> c3:In2 [label=32,fontsize=10]; 46 | c16:Out0 -> c3:In3 [label=32,fontsize=10]; 47 | c17:Out0 -> c3:In4 [label=32,fontsize=10]; 48 | c18:Out0 -> c3:In5 [label=32,fontsize=10]; 49 | c19:Out0 -> c3:In6 [label=32,fontsize=10]; 50 | c20:Out0 -> c3:In7 [label=32,fontsize=10]; 51 | c29:Out0 -> c3:In8 [label=32,fontsize=10]; 52 | c30:Out0 -> c3:In9 [label=32,fontsize=10]; 53 | c31:Out0 -> c3:In10 [label=32,fontsize=10]; 54 | c32:Out0 -> c3:In11 [label=32,fontsize=10]; 55 | c33:Out0 -> c3:In12 [label=32,fontsize=10]; 56 | c34:Out0 -> c3:In13 [label=32,fontsize=10]; 57 | c35:Out0 -> c3:In14 [label=32,fontsize=10]; 58 | c36:Out0 -> c3:In15 [label=32,fontsize=10]; 59 | c2:Out0 -> c4:In0 [label=32,fontsize=10]; 60 | c2:Out0 -> c4:In1 [label=32,fontsize=10]; 61 | c2:Out0 -> c5:In0 [label=32,fontsize=10]; 62 | c1:Out0 -> c5:In1 [label=32,fontsize=10]; 63 | c1:Out0 -> c6:In0 [label=32,fontsize=10]; 64 | c1:Out0 -> c6:In1 [label=32,fontsize=10]; 65 | c1:Out0 -> c7:In0 [label=32,fontsize=10]; 66 | c6:Out0 -> c7:In1 [label=32,fontsize=10]; 67 | c1:Out0 -> c8:In0 [label=32,fontsize=10]; 68 | c5:Out0 -> c8:In1 [label=32,fontsize=10]; 69 | c1:Out0 -> c9:In0 [label=32,fontsize=10]; 70 | c7:Out0 -> c9:In1 [label=32,fontsize=10]; 71 | c1:Out0 -> c10:In0 [label=32,fontsize=10]; 72 | c8:Out0 -> c10:In1 [label=32,fontsize=10]; 73 | c1:Out0 -> c11:In0 [label=32,fontsize=10]; 74 | c21:Out0 -> c11:In1 [label=32,fontsize=10]; 75 | c1:Out0 -> c12:In0 [label=32,fontsize=10]; 76 | c22:Out0 -> c12:In1 [label=32,fontsize=10]; 77 | c1:Out0 -> c13:In0 [label=32,fontsize=10]; 78 | c9:Out0 -> c13:In1 [label=32,fontsize=10]; 79 | c1:Out0 -> c14:In0 [label=32,fontsize=10]; 80 | c10:Out0 -> c14:In1 [label=32,fontsize=10]; 81 | c1:Out0 -> c15:In0 [label=32,fontsize=10]; 82 | c11:Out0 -> c15:In1 [label=32,fontsize=10]; 83 | c1:Out0 -> c16:In0 [label=32,fontsize=10]; 84 | c12:Out0 -> c16:In1 [label=32,fontsize=10]; 85 | c1:Out0 -> c17:In0 [label=32,fontsize=10]; 86 | c24:Out0 -> c17:In1 [label=32,fontsize=10]; 87 | c1:Out0 -> c18:In0 [label=32,fontsize=10]; 88 | c25:Out0 -> c18:In1 [label=32,fontsize=10]; 89 | c1:Out0 -> c19:In0 [label=32,fontsize=10]; 90 | c26:Out0 -> c19:In1 [label=32,fontsize=10]; 91 | c1:Out0 -> c20:In0 [label=32,fontsize=10]; 92 | c27:Out0 -> c20:In1 [label=32,fontsize=10]; 93 | c4:Out0 -> c21:In0 [label=32,fontsize=10]; 94 | c6:Out0 -> c21:In1 [label=32,fontsize=10]; 95 | c4:Out0 -> c22:In0 [label=32,fontsize=10]; 96 | c5:Out0 -> c22:In1 [label=32,fontsize=10]; 97 | c4:Out0 -> c23:In0 [label=32,fontsize=10]; 98 | c4:Out0 -> c23:In1 [label=32,fontsize=10]; 99 | c23:Out0 -> c24:In0 [label=32,fontsize=10]; 100 | c7:Out0 -> c24:In1 [label=32,fontsize=10]; 101 | c23:Out0 -> c25:In0 [label=32,fontsize=10]; 102 | c8:Out0 -> c25:In1 [label=32,fontsize=10]; 103 | c23:Out0 -> c26:In0 [label=32,fontsize=10]; 104 | c21:Out0 -> c26:In1 [label=32,fontsize=10]; 105 | c23:Out0 -> c27:In0 [label=32,fontsize=10]; 106 | c22:Out0 -> c27:In1 [label=32,fontsize=10]; 107 | c23:Out0 -> c28:In0 [label=32,fontsize=10]; 108 | c23:Out0 -> c28:In1 [label=32,fontsize=10]; 109 | c28:Out0 -> c29:In0 [label=32,fontsize=10]; 110 | c9:Out0 -> c29:In1 [label=32,fontsize=10]; 111 | c28:Out0 -> c30:In0 [label=32,fontsize=10]; 112 | c10:Out0 -> c30:In1 [label=32,fontsize=10]; 113 | c28:Out0 -> c31:In0 [label=32,fontsize=10]; 114 | c11:Out0 -> c31:In1 [label=32,fontsize=10]; 115 | c28:Out0 -> c32:In0 [label=32,fontsize=10]; 116 | c12:Out0 -> c32:In1 [label=32,fontsize=10]; 117 | c28:Out0 -> c33:In0 [label=32,fontsize=10]; 118 | c24:Out0 -> c33:In1 [label=32,fontsize=10]; 119 | c28:Out0 -> c34:In0 [label=32,fontsize=10]; 120 | c25:Out0 -> c34:In1 [label=32,fontsize=10]; 121 | c28:Out0 -> c35:In0 [label=32,fontsize=10]; 122 | c26:Out0 -> c35:In1 [label=32,fontsize=10]; 123 | c28:Out0 -> c36:In0 [label=32,fontsize=10]; 124 | c27:Out0 -> c36:In1 [label=32,fontsize=10]; 125 | } 126 | 127 | // Components: 1 1, 33 mul, 34 total. Max depth: 4. 128 | -------------------------------------------------------------------------------- /dots/powers-rt4.dot: -------------------------------------------------------------------------------- 1 | digraph powers_rt4 { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | bgcolor=transparent; 5 | nslimit=20; 6 | ranksep=3; 7 | c1 [label="{1|{}}"]; 8 | c2 [label="{In|{}}"]; 9 | c3 [label="{{|||||||||||||||}|Out}"]; 10 | c4 [label="{{|}|×|{}}"]; 11 | c5 [label="{{|}|×|{}}"]; 12 | c6 [label="{{|}|×|{}}"]; 13 | c7 [label="{{|}|×|{}}"]; 14 | c8 [label="{{|}|×|{}}"]; 15 | c9 [label="{{|}|×|{}}"]; 16 | c10 [label="{{|}|×|{}}"]; 17 | c11 [label="{{|}|×|{}}"]; 18 | c12 [label="{{|}|×|{}}"]; 19 | c13 [label="{{|}|×|{}}"]; 20 | c14 [label="{{|}|×|{}}"]; 21 | c15 [label="{{|}|×|{}}"]; 22 | c16 [label="{{|}|×|{}}"]; 23 | c17 [label="{{|}|×|{}}"]; 24 | c1:Out0 -> c3:In0 [label=32,fontsize=10]; 25 | c2:Out0 -> c3:In1 [label=32,fontsize=10]; 26 | c4:Out0 -> c3:In2 [label=32,fontsize=10]; 27 | c5:Out0 -> c3:In3 [label=32,fontsize=10]; 28 | c8:Out0 -> c3:In4 [label=32,fontsize=10]; 29 | c6:Out0 -> c3:In5 [label=32,fontsize=10]; 30 | c9:Out0 -> c3:In6 [label=32,fontsize=10]; 31 | c11:Out0 -> c3:In7 [label=32,fontsize=10]; 32 | c13:Out0 -> c3:In8 [label=32,fontsize=10]; 33 | c7:Out0 -> c3:In9 [label=32,fontsize=10]; 34 | c10:Out0 -> c3:In10 [label=32,fontsize=10]; 35 | c12:Out0 -> c3:In11 [label=32,fontsize=10]; 36 | c14:Out0 -> c3:In12 [label=32,fontsize=10]; 37 | c15:Out0 -> c3:In13 [label=32,fontsize=10]; 38 | c16:Out0 -> c3:In14 [label=32,fontsize=10]; 39 | c17:Out0 -> c3:In15 [label=32,fontsize=10]; 40 | c2:Out0 -> c4:In0 [label=32,fontsize=10]; 41 | c2:Out0 -> c4:In1 [label=32,fontsize=10]; 42 | c2:Out0 -> c5:In0 [label=32,fontsize=10]; 43 | c4:Out0 -> c5:In1 [label=32,fontsize=10]; 44 | c2:Out0 -> c6:In0 [label=32,fontsize=10]; 45 | c8:Out0 -> c6:In1 [label=32,fontsize=10]; 46 | c2:Out0 -> c7:In0 [label=32,fontsize=10]; 47 | c13:Out0 -> c7:In1 [label=32,fontsize=10]; 48 | c4:Out0 -> c8:In0 [label=32,fontsize=10]; 49 | c4:Out0 -> c8:In1 [label=32,fontsize=10]; 50 | c4:Out0 -> c9:In0 [label=32,fontsize=10]; 51 | c8:Out0 -> c9:In1 [label=32,fontsize=10]; 52 | c4:Out0 -> c10:In0 [label=32,fontsize=10]; 53 | c13:Out0 -> c10:In1 [label=32,fontsize=10]; 54 | c5:Out0 -> c11:In0 [label=32,fontsize=10]; 55 | c8:Out0 -> c11:In1 [label=32,fontsize=10]; 56 | c5:Out0 -> c12:In0 [label=32,fontsize=10]; 57 | c13:Out0 -> c12:In1 [label=32,fontsize=10]; 58 | c8:Out0 -> c13:In0 [label=32,fontsize=10]; 59 | c8:Out0 -> c13:In1 [label=32,fontsize=10]; 60 | c8:Out0 -> c14:In0 [label=32,fontsize=10]; 61 | c13:Out0 -> c14:In1 [label=32,fontsize=10]; 62 | c6:Out0 -> c15:In0 [label=32,fontsize=10]; 63 | c13:Out0 -> c15:In1 [label=32,fontsize=10]; 64 | c9:Out0 -> c16:In0 [label=32,fontsize=10]; 65 | c13:Out0 -> c16:In1 [label=32,fontsize=10]; 66 | c11:Out0 -> c17:In0 [label=32,fontsize=10]; 67 | c13:Out0 -> c17:In1 [label=32,fontsize=10]; 68 | } 69 | 70 | // Components: 1 1, 14 ×, 15 total. Max depth: 4. 71 | -------------------------------------------------------------------------------- /dots/shiftR-iota-v3.dot: -------------------------------------------------------------------------------- 1 | digraph shiftR_iota_v3 { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | bgcolor=transparent; 5 | c1 [label="{{}|Cons 0|{}}"]; 6 | c2 [label="{{}|Cons 1|{}}"]; 7 | c3 [label="{{}|Cons 2|{}}"]; 8 | c4 [label="{In|{}}"]; 9 | c6 [label="{{}|Out}"]; 10 | c2:Out0 -> c1:In0 [label=32,fontsize=10]; 11 | c3:Out0 -> c2:In0 [label=32,fontsize=10]; 12 | c4:Out0 -> c3:In0 [label=32,fontsize=10]; 13 | c1:Out0 -> c6:In0 [label=32,fontsize=10]; 14 | } 15 | 16 | // No components. 17 | -------------------------------------------------------------------------------- /dots/sum-2.dot: -------------------------------------------------------------------------------- 1 | digraph { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | // ratio=1; 5 | c0 [label="{In|{|}}"]; 6 | c1 [label="{{|}|+|{}}"]; 7 | c2 [label="{{}|Out}"]; 8 | c0:Out0 -> c1:In0 [label="32"]; 9 | c0:Out1 -> c1:In1 [label="32"]; 10 | c1:Out0 -> c2:In0 [label="32"]; 11 | } 12 | -------------------------------------------------------------------------------- /dots/sum-4a.dot: -------------------------------------------------------------------------------- 1 | digraph { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | // ratio=1; 5 | c0 [label="{In|{|||}}"]; 6 | c1 [label="{{|}|+|{}}"]; 7 | c2 [label="{{|}|+|{}}"]; 8 | c3 [label="{{|}|+|{}}"]; 9 | c4 [label="{{}|Out}"]; 10 | c0:Out0 -> c1:In0 [label="32"]; 11 | c0:Out1 -> c1:In1 [label="32"]; 12 | c1:Out0 -> c2:In0 [label="32"]; 13 | c0:Out2 -> c2:In1 [label="32"]; 14 | c2:Out0 -> c3:In0 [label="32"]; 15 | c0:Out3 -> c3:In1 [label="32"]; 16 | c3:Out0 -> c4:In0 [label="32"]; 17 | } 18 | -------------------------------------------------------------------------------- /dots/sum-4b.dot: -------------------------------------------------------------------------------- 1 | digraph { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | // ratio=1; 5 | c0 [label="{In|{|||}}"]; 6 | c1 [label="{{|}|+|{}}"]; 7 | c2 [label="{{|}|+|{}}"]; 8 | c3 [label="{{|}|+|{}}"]; 9 | c4 [label="{{}|Out}"]; 10 | c0:Out0 -> c1:In0 [label="32"]; 11 | c0:Out1 -> c1:In1 [label="32"]; 12 | c0:Out2 -> c2:In0 [label="32"]; 13 | c0:Out3 -> c2:In1 [label="32"]; 14 | c1:Out0 -> c3:In0 [label="32"]; 15 | c2:Out0 -> c3:In1 [label="32"]; 16 | c3:Out0 -> c4:In0 [label="32"]; 17 | } 18 | -------------------------------------------------------------------------------- /dots/sum-p.dot: -------------------------------------------------------------------------------- 1 | digraph sum_p { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | bgcolor=transparent; 5 | nslimit=20; 6 | c0 [label="{{|}|+|{}}"]; 7 | c1 [label="{In|{|}}"]; 8 | c2 [label="{{}|Out}"]; 9 | c1:Out0 -> c0:In0 [label=32,fontsize=10]; 10 | c1:Out1 -> c0:In1 [label=32,fontsize=10]; 11 | c0:Out0 -> c2:In0 [label=32,fontsize=10]; 12 | } 13 | 14 | // Components: 1 +. Max depth: 1. 15 | -------------------------------------------------------------------------------- /dots/sum-t4.dot: -------------------------------------------------------------------------------- 1 | digraph { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | // ratio=1; 5 | c0 [label="{In|{|||||||||||||||}}"]; 6 | c1 [label="{{|}|+|{}}"]; 7 | c2 [label="{{|}|+|{}}"]; 8 | c3 [label="{{|}|+|{}}"]; 9 | c4 [label="{{|}|+|{}}"]; 10 | c5 [label="{{|}|+|{}}"]; 11 | c6 [label="{{|}|+|{}}"]; 12 | c7 [label="{{|}|+|{}}"]; 13 | c8 [label="{{|}|+|{}}"]; 14 | c9 [label="{{|}|+|{}}"]; 15 | c10 [label="{{|}|+|{}}"]; 16 | c11 [label="{{|}|+|{}}"]; 17 | c12 [label="{{|}|+|{}}"]; 18 | c13 [label="{{|}|+|{}}"]; 19 | c14 [label="{{|}|+|{}}"]; 20 | c15 [label="{{|}|+|{}}"]; 21 | c16 [label="{{}|Out}"]; 22 | c0:Out0 -> c1:In0 [label="32",fontsize=10]; 23 | c0:Out1 -> c1:In1 [label="32",fontsize=10]; 24 | c0:Out2 -> c2:In0 [label="32",fontsize=10]; 25 | c0:Out3 -> c2:In1 [label="32",fontsize=10]; 26 | c1:Out0 -> c3:In0 [label="32",fontsize=10]; 27 | c2:Out0 -> c3:In1 [label="32",fontsize=10]; 28 | c0:Out4 -> c4:In0 [label="32",fontsize=10]; 29 | c0:Out5 -> c4:In1 [label="32",fontsize=10]; 30 | c0:Out6 -> c5:In0 [label="32",fontsize=10]; 31 | c0:Out7 -> c5:In1 [label="32",fontsize=10]; 32 | c4:Out0 -> c6:In0 [label="32",fontsize=10]; 33 | c5:Out0 -> c6:In1 [label="32",fontsize=10]; 34 | c3:Out0 -> c7:In0 [label="32",fontsize=10]; 35 | c6:Out0 -> c7:In1 [label="32",fontsize=10]; 36 | c0:Out8 -> c8:In0 [label="32",fontsize=10]; 37 | c0:Out9 -> c8:In1 [label="32",fontsize=10]; 38 | c0:Out10 -> c9:In0 [label="32",fontsize=10]; 39 | c0:Out11 -> c9:In1 [label="32",fontsize=10]; 40 | c8:Out0 -> c10:In0 [label="32",fontsize=10]; 41 | c9:Out0 -> c10:In1 [label="32",fontsize=10]; 42 | c0:Out12 -> c11:In0 [label="32",fontsize=10]; 43 | c0:Out13 -> c11:In1 [label="32",fontsize=10]; 44 | c0:Out14 -> c12:In0 [label="32",fontsize=10]; 45 | c0:Out15 -> c12:In1 [label="32",fontsize=10]; 46 | c11:Out0 -> c13:In0 [label="32",fontsize=10]; 47 | c12:Out0 -> c13:In1 [label="32",fontsize=10]; 48 | c10:Out0 -> c14:In0 [label="32",fontsize=10]; 49 | c13:Out0 -> c14:In1 [label="32",fontsize=10]; 50 | c7:Out0 -> c15:In0 [label="32",fontsize=10]; 51 | c14:Out0 -> c15:In1 [label="32",fontsize=10]; 52 | c15:Out0 -> c16:In0 [label="32",fontsize=10]; 53 | } 54 | -------------------------------------------------------------------------------- /dots/sum-v6-0.dot: -------------------------------------------------------------------------------- 1 | digraph { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | // ratio=1; 5 | c0 [label="{In|{|||||}}"]; 6 | c1 [label="{0|{}}"]; 7 | c2 [label="{{|}|+|{}}"]; 8 | c3 [label="{{|}|+|{}}"]; 9 | c4 [label="{{|}|+|{}}"]; 10 | c5 [label="{{|}|+|{}}"]; 11 | c6 [label="{{|}|+|{}}"]; 12 | c7 [label="{{|}|+|{}}"]; 13 | c8 [label="{{}|Out}"]; 14 | c0:Out5 -> c2:In0 [label="32"]; 15 | c1:Out0 -> c2:In1 [label="32"]; 16 | c0:Out4 -> c3:In0 [label="32"]; 17 | c2:Out0 -> c3:In1 [label="32"]; 18 | c0:Out3 -> c4:In0 [label="32"]; 19 | c3:Out0 -> c4:In1 [label="32"]; 20 | c0:Out2 -> c5:In0 [label="32"]; 21 | c4:Out0 -> c5:In1 [label="32"]; 22 | c0:Out1 -> c6:In0 [label="32"]; 23 | c5:Out0 -> c6:In1 [label="32"]; 24 | c0:Out0 -> c7:In0 [label="32"]; 25 | c6:Out0 -> c7:In1 [label="32"]; 26 | c7:Out0 -> c8:In0 [label="32"]; 27 | } 28 | -------------------------------------------------------------------------------- /dots/sum-v6.dot: -------------------------------------------------------------------------------- 1 | digraph { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | // ratio=1; 5 | c0 [label="{In|{|||||}}"]; 6 | c1 [label="{{|}|+|{}}"]; 7 | c2 [label="{{|}|+|{}}"]; 8 | c3 [label="{{|}|+|{}}"]; 9 | c4 [label="{{|}|+|{}}"]; 10 | c5 [label="{{|}|+|{}}"]; 11 | c6 [label="{{}|Out}"]; 12 | c0:Out4 -> c1:In0 [label="32"]; 13 | c0:Out5 -> c1:In1 [label="32"]; 14 | c0:Out3 -> c2:In0 [label="32"]; 15 | c1:Out0 -> c2:In1 [label="32"]; 16 | c0:Out2 -> c3:In0 [label="32"]; 17 | c2:Out0 -> c3:In1 [label="32"]; 18 | c0:Out1 -> c4:In0 [label="32"]; 19 | c3:Out0 -> c4:In1 [label="32"]; 20 | c0:Out0 -> c5:In0 [label="32"]; 21 | c4:Out0 -> c5:In1 [label="32"]; 22 | c5:Out0 -> c6:In0 [label="32"]; 23 | } 24 | -------------------------------------------------------------------------------- /dots/sumSquare-p.dot: -------------------------------------------------------------------------------- 1 | digraph sumSquare_p { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | bgcolor=transparent; 5 | c0 [label="{In|{|}}"]; 6 | c1 [label="{{}|Out}"]; 7 | c2 [label="{{|}|+|{}}"]; 8 | c3 [label="{{|}|×|{}}"]; 9 | c4 [label="{{|}|×|{}}"]; 10 | c2:Out0 -> c1:In0 [label="32",fontsize=10]; 11 | c3:Out0 -> c2:In0 [label="32",fontsize=10]; 12 | c4:Out0 -> c2:In1 [label="32",fontsize=10]; 13 | c0:Out0 -> c3:In0 [label="32",fontsize=10]; 14 | c0:Out0 -> c3:In1 [label="32",fontsize=10]; 15 | c0:Out1 -> c4:In0 [label="32",fontsize=10]; 16 | c0:Out1 -> c4:In1 [label="32",fontsize=10]; 17 | } 18 | 19 | // Components: 1 add, 2 mul, 3 total. Depth: 2. 20 | -------------------------------------------------------------------------------- /dots/sumSquare-t2.dot: -------------------------------------------------------------------------------- 1 | digraph { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | // ratio=1; 5 | c0 [label="{In|{|||}}"]; 6 | c1 [label="{{|}|×|{}}"]; 7 | c2 [label="{{|}|×|{}}"]; 8 | c3 [label="{{|}|×|{}}"]; 9 | c4 [label="{{|}|×|{}}"]; 10 | c5 [label="{{|}|+|{}}"]; 11 | c6 [label="{{|}|+|{}}"]; 12 | c7 [label="{{|}|+|{}}"]; 13 | c8 [label="{{}|Out}"]; 14 | c0:Out0 -> c1:In0 [label="32",fontsize=10]; 15 | c0:Out0 -> c1:In1 [label="32",fontsize=10]; 16 | c0:Out1 -> c2:In0 [label="32",fontsize=10]; 17 | c0:Out1 -> c2:In1 [label="32",fontsize=10]; 18 | c0:Out2 -> c3:In0 [label="32",fontsize=10]; 19 | c0:Out2 -> c3:In1 [label="32",fontsize=10]; 20 | c0:Out3 -> c4:In0 [label="32",fontsize=10]; 21 | c0:Out3 -> c4:In1 [label="32",fontsize=10]; 22 | c1:Out0 -> c5:In0 [label="32",fontsize=10]; 23 | c2:Out0 -> c5:In1 [label="32",fontsize=10]; 24 | c3:Out0 -> c6:In0 [label="32",fontsize=10]; 25 | c4:Out0 -> c6:In1 [label="32",fontsize=10]; 26 | c5:Out0 -> c7:In0 [label="32",fontsize=10]; 27 | c6:Out0 -> c7:In1 [label="32",fontsize=10]; 28 | c7:Out0 -> c8:In0 [label="32",fontsize=10]; 29 | } 30 | -------------------------------------------------------------------------------- /dots/sumSquare-t3.dot: -------------------------------------------------------------------------------- 1 | digraph sumSquare_t3 { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | bgcolor=transparent; 5 | ranksep=1; 6 | c0 [label="{In|{|||||||}}"]; 7 | c1 [label="{{}|Out}"]; 8 | c2 [label="{{|}|+|{}}"]; 9 | c3 [label="{{|}|+|{}}"]; 10 | c4 [label="{{|}|+|{}}"]; 11 | c5 [label="{{|}|+|{}}"]; 12 | c6 [label="{{|}|+|{}}"]; 13 | c7 [label="{{|}|+|{}}"]; 14 | c8 [label="{{|}|+|{}}"]; 15 | c9 [label="{{|}|×|{}}"]; 16 | c10 [label="{{|}|×|{}}"]; 17 | c11 [label="{{|}|×|{}}"]; 18 | c12 [label="{{|}|×|{}}"]; 19 | c13 [label="{{|}|×|{}}"]; 20 | c14 [label="{{|}|×|{}}"]; 21 | c15 [label="{{|}|×|{}}"]; 22 | c16 [label="{{|}|×|{}}"]; 23 | c7:Out0 -> c1:In0 [label="32",fontsize=10]; 24 | c9:Out0 -> c2:In0 [label="32",fontsize=10]; 25 | c10:Out0 -> c2:In1 [label="32",fontsize=10]; 26 | c11:Out0 -> c3:In0 [label="32",fontsize=10]; 27 | c12:Out0 -> c3:In1 [label="32",fontsize=10]; 28 | c13:Out0 -> c4:In0 [label="32",fontsize=10]; 29 | c14:Out0 -> c4:In1 [label="32",fontsize=10]; 30 | c15:Out0 -> c5:In0 [label="32",fontsize=10]; 31 | c16:Out0 -> c5:In1 [label="32",fontsize=10]; 32 | c2:Out0 -> c6:In0 [label="32",fontsize=10]; 33 | c3:Out0 -> c6:In1 [label="32",fontsize=10]; 34 | c6:Out0 -> c7:In0 [label="32",fontsize=10]; 35 | c8:Out0 -> c7:In1 [label="32",fontsize=10]; 36 | c4:Out0 -> c8:In0 [label="32",fontsize=10]; 37 | c5:Out0 -> c8:In1 [label="32",fontsize=10]; 38 | c0:Out0 -> c9:In0 [label="32",fontsize=10]; 39 | c0:Out0 -> c9:In1 [label="32",fontsize=10]; 40 | c0:Out1 -> c10:In0 [label="32",fontsize=10]; 41 | c0:Out1 -> c10:In1 [label="32",fontsize=10]; 42 | c0:Out2 -> c11:In0 [label="32",fontsize=10]; 43 | c0:Out2 -> c11:In1 [label="32",fontsize=10]; 44 | c0:Out3 -> c12:In0 [label="32",fontsize=10]; 45 | c0:Out3 -> c12:In1 [label="32",fontsize=10]; 46 | c0:Out4 -> c13:In0 [label="32",fontsize=10]; 47 | c0:Out4 -> c13:In1 [label="32",fontsize=10]; 48 | c0:Out5 -> c14:In0 [label="32",fontsize=10]; 49 | c0:Out5 -> c14:In1 [label="32",fontsize=10]; 50 | c0:Out6 -> c15:In0 [label="32",fontsize=10]; 51 | c0:Out6 -> c15:In1 [label="32",fontsize=10]; 52 | c0:Out7 -> c16:In0 [label="32",fontsize=10]; 53 | c0:Out7 -> c16:In1 [label="32",fontsize=10]; 54 | } 55 | 56 | // Components: 7 add, 8 mul, 15 total. Depth: 4. 57 | -------------------------------------------------------------------------------- /dots/sumSquare-t4.dot: -------------------------------------------------------------------------------- 1 | digraph { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | // ratio=1; 5 | ranksep=1.5; 6 | c0 [label="{In|{|||||||||||||||}}"]; 7 | c1 [label="{{|}|×|{}}"]; 8 | c2 [label="{{|}|×|{}}"]; 9 | c3 [label="{{|}|×|{}}"]; 10 | c4 [label="{{|}|×|{}}"]; 11 | c5 [label="{{|}|×|{}}"]; 12 | c6 [label="{{|}|×|{}}"]; 13 | c7 [label="{{|}|×|{}}"]; 14 | c8 [label="{{|}|×|{}}"]; 15 | c9 [label="{{|}|×|{}}"]; 16 | c10 [label="{{|}|×|{}}"]; 17 | c11 [label="{{|}|×|{}}"]; 18 | c12 [label="{{|}|×|{}}"]; 19 | c13 [label="{{|}|×|{}}"]; 20 | c14 [label="{{|}|×|{}}"]; 21 | c15 [label="{{|}|×|{}}"]; 22 | c16 [label="{{|}|×|{}}"]; 23 | c17 [label="{{|}|+|{}}"]; 24 | c18 [label="{{|}|+|{}}"]; 25 | c19 [label="{{|}|+|{}}"]; 26 | c20 [label="{{|}|+|{}}"]; 27 | c21 [label="{{|}|+|{}}"]; 28 | c22 [label="{{|}|+|{}}"]; 29 | c23 [label="{{|}|+|{}}"]; 30 | c24 [label="{{|}|+|{}}"]; 31 | c25 [label="{{|}|+|{}}"]; 32 | c26 [label="{{|}|+|{}}"]; 33 | c27 [label="{{|}|+|{}}"]; 34 | c28 [label="{{|}|+|{}}"]; 35 | c29 [label="{{|}|+|{}}"]; 36 | c30 [label="{{|}|+|{}}"]; 37 | c31 [label="{{|}|+|{}}"]; 38 | c32 [label="{{}|Out}"]; 39 | c0:Out0 -> c1:In0 [label="32"]; 40 | c0:Out0 -> c1:In1 [label="32"]; 41 | c0:Out1 -> c2:In0 [label="32"]; 42 | c0:Out1 -> c2:In1 [label="32"]; 43 | c0:Out2 -> c3:In0 [label="32"]; 44 | c0:Out2 -> c3:In1 [label="32"]; 45 | c0:Out3 -> c4:In0 [label="32"]; 46 | c0:Out3 -> c4:In1 [label="32"]; 47 | c0:Out4 -> c5:In0 [label="32"]; 48 | c0:Out4 -> c5:In1 [label="32"]; 49 | c0:Out5 -> c6:In0 [label="32"]; 50 | c0:Out5 -> c6:In1 [label="32"]; 51 | c0:Out6 -> c7:In0 [label="32"]; 52 | c0:Out6 -> c7:In1 [label="32"]; 53 | c0:Out7 -> c8:In0 [label="32"]; 54 | c0:Out7 -> c8:In1 [label="32"]; 55 | c0:Out8 -> c9:In0 [label="32"]; 56 | c0:Out8 -> c9:In1 [label="32"]; 57 | c0:Out9 -> c10:In0 [label="32"]; 58 | c0:Out9 -> c10:In1 [label="32"]; 59 | c0:Out10 -> c11:In0 [label="32"]; 60 | c0:Out10 -> c11:In1 [label="32"]; 61 | c0:Out11 -> c12:In0 [label="32"]; 62 | c0:Out11 -> c12:In1 [label="32"]; 63 | c0:Out12 -> c13:In0 [label="32"]; 64 | c0:Out12 -> c13:In1 [label="32"]; 65 | c0:Out13 -> c14:In0 [label="32"]; 66 | c0:Out13 -> c14:In1 [label="32"]; 67 | c0:Out14 -> c15:In0 [label="32"]; 68 | c0:Out14 -> c15:In1 [label="32"]; 69 | c0:Out15 -> c16:In0 [label="32"]; 70 | c0:Out15 -> c16:In1 [label="32"]; 71 | c1:Out0 -> c17:In0 [label="32"]; 72 | c2:Out0 -> c17:In1 [label="32"]; 73 | c3:Out0 -> c18:In0 [label="32"]; 74 | c4:Out0 -> c18:In1 [label="32"]; 75 | c17:Out0 -> c19:In0 [label="32"]; 76 | c18:Out0 -> c19:In1 [label="32"]; 77 | c5:Out0 -> c20:In0 [label="32"]; 78 | c6:Out0 -> c20:In1 [label="32"]; 79 | c7:Out0 -> c21:In0 [label="32"]; 80 | c8:Out0 -> c21:In1 [label="32"]; 81 | c20:Out0 -> c22:In0 [label="32"]; 82 | c21:Out0 -> c22:In1 [label="32"]; 83 | c19:Out0 -> c23:In0 [label="32"]; 84 | c22:Out0 -> c23:In1 [label="32"]; 85 | c9:Out0 -> c24:In0 [label="32"]; 86 | c10:Out0 -> c24:In1 [label="32"]; 87 | c11:Out0 -> c25:In0 [label="32"]; 88 | c12:Out0 -> c25:In1 [label="32"]; 89 | c24:Out0 -> c26:In0 [label="32"]; 90 | c25:Out0 -> c26:In1 [label="32"]; 91 | c13:Out0 -> c27:In0 [label="32"]; 92 | c14:Out0 -> c27:In1 [label="32"]; 93 | c15:Out0 -> c28:In0 [label="32"]; 94 | c16:Out0 -> c28:In1 [label="32"]; 95 | c27:Out0 -> c29:In0 [label="32"]; 96 | c28:Out0 -> c29:In1 [label="32"]; 97 | c26:Out0 -> c30:In0 [label="32"]; 98 | c29:Out0 -> c30:In1 [label="32"]; 99 | c23:Out0 -> c31:In0 [label="32"]; 100 | c30:Out0 -> c31:In1 [label="32"]; 101 | c31:Out0 -> c32:In0 [label="32"]; 102 | } 103 | -------------------------------------------------------------------------------- /dots/transpose-pt4.dot: -------------------------------------------------------------------------------- 1 | digraph transpose_pt4 { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | bgcolor=transparent; 5 | ranksep="4.0"; 6 | c0 [label="{In|{|||||||||||||||||||||||||||||||}}"]; 7 | c1 [label="{{|||||||||||||||||||||||||||||||}|Out}"]; 8 | c0:Out0 -> c1:In0 ; 9 | c0:Out16 -> c1:In1 ; 10 | c0:Out1 -> c1:In2 ; 11 | c0:Out17 -> c1:In3 ; 12 | c0:Out2 -> c1:In4 ; 13 | c0:Out18 -> c1:In5 ; 14 | c0:Out3 -> c1:In6 ; 15 | c0:Out19 -> c1:In7 ; 16 | c0:Out4 -> c1:In8 ; 17 | c0:Out20 -> c1:In9 ; 18 | c0:Out5 -> c1:In10 ; 19 | c0:Out21 -> c1:In11 ; 20 | c0:Out6 -> c1:In12 ; 21 | c0:Out22 -> c1:In13 ; 22 | c0:Out7 -> c1:In14 ; 23 | c0:Out23 -> c1:In15 ; 24 | c0:Out8 -> c1:In16 ; 25 | c0:Out24 -> c1:In17 ; 26 | c0:Out9 -> c1:In18 ; 27 | c0:Out25 -> c1:In19 ; 28 | c0:Out10 -> c1:In20 ; 29 | c0:Out26 -> c1:In21 ; 30 | c0:Out11 -> c1:In22 ; 31 | c0:Out27 -> c1:In23 ; 32 | c0:Out12 -> c1:In24 ; 33 | c0:Out28 -> c1:In25 ; 34 | c0:Out13 -> c1:In26 ; 35 | c0:Out29 -> c1:In27 ; 36 | c0:Out14 -> c1:In28 ; 37 | c0:Out30 -> c1:In29 ; 38 | c0:Out15 -> c1:In30 ; 39 | c0:Out31 -> c1:In31 ; 40 | } 41 | 42 | // No components. 43 | -------------------------------------------------------------------------------- /dots/transpose-t4p.dot: -------------------------------------------------------------------------------- 1 | digraph transpose_t4p { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | bgcolor=transparent; 5 | ranksep="4.0"; 6 | c0 [label="{In|{|||||||||||||||||||||||||||||||}}"]; 7 | c1 [label="{{|||||||||||||||||||||||||||||||}|Out}"]; 8 | c0:Out0 -> c1:In0 ; 9 | c0:Out2 -> c1:In1 ; 10 | c0:Out4 -> c1:In2 ; 11 | c0:Out6 -> c1:In3 ; 12 | c0:Out8 -> c1:In4 ; 13 | c0:Out10 -> c1:In5 ; 14 | c0:Out12 -> c1:In6 ; 15 | c0:Out14 -> c1:In7 ; 16 | c0:Out16 -> c1:In8 ; 17 | c0:Out18 -> c1:In9 ; 18 | c0:Out20 -> c1:In10 ; 19 | c0:Out22 -> c1:In11 ; 20 | c0:Out24 -> c1:In12 ; 21 | c0:Out26 -> c1:In13 ; 22 | c0:Out28 -> c1:In14 ; 23 | c0:Out30 -> c1:In15 ; 24 | c0:Out1 -> c1:In16 ; 25 | c0:Out3 -> c1:In17 ; 26 | c0:Out5 -> c1:In18 ; 27 | c0:Out7 -> c1:In19 ; 28 | c0:Out9 -> c1:In20 ; 29 | c0:Out11 -> c1:In21 ; 30 | c0:Out13 -> c1:In22 ; 31 | c0:Out15 -> c1:In23 ; 32 | c0:Out17 -> c1:In24 ; 33 | c0:Out19 -> c1:In25 ; 34 | c0:Out21 -> c1:In26 ; 35 | c0:Out23 -> c1:In27 ; 36 | c0:Out25 -> c1:In28 ; 37 | c0:Out27 -> c1:In29 ; 38 | c0:Out29 -> c1:In30 ; 39 | c0:Out31 -> c1:In31 ; 40 | } 41 | 42 | // No components. 43 | -------------------------------------------------------------------------------- /haskell-to-hardware.lhs: -------------------------------------------------------------------------------- 1 | %% -*- latex -*- 2 | 3 | %% %let atwork = True 4 | 5 | % Presentation 6 | \documentclass{beamer} 7 | %% \documentclass[handout]{beamer} 8 | 9 | %% % Printed, 2-up 10 | %% \documentclass[serif,handout]{beamer} 11 | %% \usepackage{pgfpages} 12 | %% \pgfpagesuselayout{2 on 1}[border shrink=1mm] 13 | 14 | %% % Printed, 4-up 15 | %% \documentclass[serif,handout,landscape]{beamer} 16 | %% \usepackage{pgfpages} 17 | %% \pgfpagesuselayout{4 on 1}[border shrink=1mm] 18 | 19 | \usefonttheme{serif} 20 | 21 | \usepackage{hyperref} 22 | \usepackage{color} 23 | 24 | \definecolor{linkColor}{rgb}{0.62,0,0} 25 | 26 | \hypersetup{colorlinks=true,urlcolor=linkColor} 27 | 28 | %% \usepackage{beamerthemesplit} 29 | 30 | %% % http://www.latex-community.org/forum/viewtopic.php?f=44&t=16603 31 | %% \makeatletter 32 | %% \def\verbatim{\small\@verbatim \frenchspacing\@vobeyspaces \@xverbatim} 33 | %% \makeatother 34 | 35 | \usepackage{graphicx} 36 | \usepackage{color} 37 | \DeclareGraphicsExtensions{.pdf,.png,.jpg} 38 | 39 | %% \usepackage{wasysym} 40 | \usepackage{mathabx} 41 | \usepackage{setspace} 42 | \usepackage{enumerate} 43 | 44 | \useinnertheme[shadow]{rounded} 45 | % \useoutertheme{default} 46 | \useoutertheme{shadow} 47 | \useoutertheme{infolines} 48 | % Suppress navigation arrows 49 | \setbeamertemplate{navigation symbols}{} 50 | 51 | \input{macros} 52 | 53 | %\nc\partframe[1]{\framet{}{\begin{center} \vspace{6ex} {\Huge #1} \end{center}}} 54 | \nc\partframe[1]{\framet{}{\begin{center} \Huge \emph{\textcolor{blue}{#1}} \end{center}}} 55 | 56 | %include polycode.fmt 57 | %include forall.fmt 58 | %include greek.fmt 59 | 60 | %include mine.fmt 61 | 62 | %% %% A subset of mine.fmt. Steve wanted more conventional looking code. 63 | %% %format not = "\Varid{not}" 64 | %% %format :# = "\mathbin{:\!\#}" 65 | %% %format ~> = "\leadsto" 66 | %% %format Prod (k) a b = a "\times_{\hspace{-0.1ex}\scriptscriptstyle{" k "}}" b 67 | %% %format Coprod (k) a b = a "+_{\hspace{-0.4ex}\scriptscriptstyle{" k "}}" b 68 | %% %format Exp (k) a b = a "\Rightarrow_{\hspace{-0.4ex}\scriptscriptstyle{" k "}}" b 69 | %% %format *** = "\!\times\!" 70 | %% %format &&& = "\mathbin{\smalltriangleup}" 71 | %% %format ||| = "\mathbin{\smalltriangledown}" 72 | %% %format +++ = "\!+\!" 73 | %% %format N0 = 0 74 | %% %format N1 = 1 75 | %% %format N2 = 2 76 | %% %format N3 = 3 77 | %% %format N4 = 4 78 | %% %format N5 = 5 79 | %% %format N6 = 6 80 | %% %format N7 = 7 81 | %% %format N8 = 8 82 | %% %% Tweaked 83 | %% %format <$> = "\mathbin{<\!\!\$\!\!>}" 84 | %% %format <.> = "\mathbin{<\!.\!>}" 85 | %% %% hack: add missing space, e.g., before "{" in data type decl 86 | %% %format SPACE = "\ {}" 87 | %% %% Small space 88 | %% %format SSPACE = "{}" 89 | %% %format :=> = "\dashrightarrow" 90 | %% \setbeamerfont{frametitle}{size=\small} 91 | 92 | \title{From Haskell to Hardware via CCCs} 93 | \author{\href{http://conal.net}{Conal Elliott}} 94 | % \institute{Work done at \href{http://tabula.com/}{Tabula}} 95 | % Abbreviate date/venue to fit in infolines space 96 | \date{April, 2015} 97 | % \date{\emph{Draft of \today}} 98 | 99 | \setlength{\itemsep}{2ex} 100 | \setlength{\parskip}{1ex} 101 | 102 | % \setlength{\blanklineskip}{1.5ex} 103 | 104 | \nc\pitem{\pause \item} 105 | 106 | %%%% 107 | 108 | % \setbeameroption{show notes} % un-comment to see the notes 109 | 110 | \setstretch{1.2} 111 | 112 | \begin{document} 113 | 114 | \frame{\titlepage} 115 | 116 | \framet{Tabula}{ 117 | 118 | \begin{itemize}\parskip0.75ex 119 | \item Founded by Steve Teig about 11 years ago. Newly defunct. :( 120 | \item Post-FPGA hardware architecture, \emph{Spacetime}: 121 | \begin{itemize} 122 | \item 3D for shorter paths. 123 | \item Implemented by rapid reconfiguration (2GHz). 124 | \item Dense \emph{active} logic. 125 | \end{itemize} 126 | \item Program in a non-sequential language: Haskell. 127 | \item Compiler \href{https://github.com/conal/lambda-ccc/}{developed openly} and shared freely. 128 | \end{itemize} 129 | 130 | } 131 | 132 | \framet{Example}{ 133 | 134 | > square :: Num a => a -> a 135 | > square a = a * a 136 | 137 | > sumSquare :: (Functor f, Foldable f, Num a) => f a -> a 138 | > sumSquare = sum . fmap square 139 | 140 | } 141 | 142 | \framet{|sumSquare :: RTree N2 Int -> Int|}{ 143 | 144 | \begin{center} 145 | \begin{minipage}[c]{0.3\textwidth}\ \end{minipage} 146 | \begin{minipage}[c]{0.5\textwidth} 147 | 148 | > sumSquare = sum . fmap square 149 | 150 | \end{minipage} 151 | \end{center} 152 | 153 | \vspace{-10ex} 154 | \wfig{5in}{figures/sumSquare-t2} 155 | 156 | } 157 | 158 | \framet{|sumSquare :: RTree N2 Int -> Int|}{ 159 | 160 | \begin{minipage}[c]{0.0\textwidth} 161 | {\tiny 162 | \begin{verbatim} 163 | module sumSquare-t2 (In_0, In_1, In_2, In_3, Out); 164 | input [0:31] In_0; 165 | input [0:31] In_1; 166 | input [0:31] In_2; 167 | input [0:31] In_3; 168 | output [0:31] Out; 169 | wire [0:31] w_mul_I1; 170 | wire [0:31] w_mul_I2; 171 | wire [0:31] w_mul_I3; 172 | wire [0:31] w_mul_I4; 173 | wire [0:31] w_add_I5; 174 | wire [0:31] w_add_I6; 175 | wire [0:31] w_add_I7; 176 | assign w_mul_I1 = In_0 * In_0; 177 | assign w_mul_I2 = In_1 * In_1; 178 | assign w_mul_I3 = In_2 * In_2; 179 | assign w_mul_I4 = In_3 * In_3; 180 | assign w_add_I5 = w_mul_I1 + w_mul_I2; 181 | assign w_add_I6 = w_mul_I3 + w_mul_I4; 182 | assign w_add_I7 = w_add_I5 + w_add_I6; 183 | assign Out = w_add_I7; 184 | endmodule 185 | \end{verbatim} 186 | } 187 | \end{minipage} 188 | \hspace{-10ex} 189 | \begin{minipage}[c]{0.5\textwidth} 190 | \wfig{3in}{figures/sumSquare-t2} 191 | \end{minipage} 192 | } 193 | 194 | \framet{|sumSquare :: RTree N3 Int -> Int|}{ 195 | \vspace{-2ex} 196 | \wfig{4.5in}{figures/sumSquare-t3} 197 | } 198 | 199 | \framet{|sumSquare :: RTree N4 Int -> Int|}{ 200 | \vspace{-1ex} 201 | \wfig{3in}{figures/sumSquare-t4} 202 | } 203 | 204 | \partframe{How it works} 205 | 206 | \framet{Intuition: overloading lambda}{\parskip3ex 207 | 208 | Powerful abstraction mechanisms: 209 | \begin{itemize}\parskip1ex 210 | \item Lambda/application 211 | \item Type classes 212 | \end{itemize} 213 | 214 | \vspace{1ex} 215 | 216 | Can we use type classes to generalize lambda \& application? 217 | 218 | } 219 | 220 | \framet{Technical plan}{ 221 | 222 | \begin{itemize}\parskip2ex 223 | \item Convert Haskell to Core (GHC). 224 | \item Monomorphize. 225 | \item Convert to abstract vocabulary. 226 | \item Interpret as circuits. 227 | %% \item Translate to netlists. 228 | \item Synthesize \& optimize with existing HDL machinery. 229 | \end{itemize} 230 | 231 | %if False 232 | \vspace{2ex} 233 | 234 | Initial simplifications: 235 | \begin{itemize} 236 | \item Shape-typed data 237 | \item Combinational 238 | \end{itemize} 239 | %endif 240 | 241 | } 242 | 243 | \framet{(Bi-)Cartesian closed categories}{ 244 | 245 | \begin{itemize}\parskip2ex 246 | \item 247 | \emph{Category}: identity and composition 248 | \item 249 | \emph{Cartesian}: products 250 | \item 251 | \emph{Co-Cartesian}: coproducts (``sums'') 252 | \item 253 | \emph{Closed}: exponentials (arrows as ``values'') 254 | \end{itemize} 255 | 256 | \ 257 | 258 | Suffices for translating typed lambda calculus (J. Lambek, 1980). 259 | 260 | } 261 | 262 | \framet{Category}{ 263 | 264 | Interface: 265 | 266 | > class Category (~>) where 267 | > id :: a ~> a 268 | > (.) :: (b ~> c) -> (a ~> b) -> (a ~> c) 269 | 270 | Laws: 271 | 272 | > id . f == f 273 | > g . id == g 274 | > (h . g) . f == h . (g . f) 275 | 276 | } 277 | 278 | \setlength{\fboxsep}{-1ex} 279 | 280 | \framet{Products}{ 281 | 282 | > class Category (~>) => ProductCat (~>) where 283 | > type Prod (~>) a b 284 | > exl :: (Prod (~>) a b) ~> a 285 | > exr :: (Prod (~>) a b) ~> b 286 | > (&&&) :: (a ~> c) -> (a ~> d) -> (a ~> (Prod (~>) c d)) 287 | > (***) :: (a ~> c) -> (b ~> d) -> ((Prod (~>) a b) ~> (Prod (~>) c d)) 288 | > f *** g = (f . exl ) &&& (g . exr) 289 | 290 | Laws: 291 | \vspace{-1.3ex} 292 | 293 | \begin{center} 294 | \fbox{\begin{minipage}[c]{0.41\textwidth} 295 | 296 | > exl . (f &&& g) == f 297 | > exr . (f &&& g) == g 298 | > exl . h &&& exr . h == h 299 | > exl &&& exr == id 300 | 301 | \end{minipage}} 302 | \fbox{\begin{minipage}[c]{0.6\textwidth} 303 | 304 | > (f *** g) . (h &&& k) == (f . h) &&& (g . k) 305 | > id *** id == id 306 | > (f *** g) . (h *** k) == (f . h) *** (g . k) 307 | > (f &&& g) . h == (f . h) &&& (g . h) 308 | 309 | \end{minipage}} 310 | \end{center} 311 | 312 | } 313 | 314 | \framet{Coproducts}{ 315 | 316 | > class Category (~>) => CoproductCat (~>) where 317 | > type Coprod (~>) a b 318 | > inl :: a ~> (Coprod (~>) a b) 319 | > inr :: b ~> (Coprod (~>) a b) 320 | > (|||) :: (a ~> c) -> (b ~> c) -> ((Coprod (~>) a b) ~> c) 321 | > (+++) :: (a ~> c) -> (b ~> d) -> ((Coprod (~>) a b) ~> (Coprod (~>) c d)) 322 | > f +++ g = (inl . f ) ||| (inr . g) 323 | 324 | Laws (dual to product): 325 | \vspace{-1.7ex} 326 | 327 | \begin{center} 328 | \fbox{\begin{minipage}[c]{0.41\textwidth} 329 | 330 | > (f ||| g) . inl == f 331 | > (f ||| g) . inr == g 332 | > h . inl ||| h . inr == h 333 | > inl ||| inr == id 334 | 335 | \end{minipage}} 336 | \fbox{\begin{minipage}[c]{0.6\textwidth} 337 | 338 | > (h ||| k) . (f +++ g) == (h . f) ||| (k . g) 339 | > id +++ id == id 340 | > (h +++ k) . (f +++ g) == (h . f) +++ (k . g) 341 | > h . (f ||| g) == (h . f) ||| (h . g) 342 | 343 | \end{minipage}} 344 | \end{center} 345 | } 346 | 347 | \framet{Exponentials}{ 348 | 349 | > class ProductCat (~>) => ClosedCat (~>) where 350 | > type Exp (~>) a b 351 | > apply :: (Prod (~>) (Exp (~>) a b) a) ~> b 352 | > curry :: ((Prod (~>) a b) ~> c) -> (a ~> (Exp (~>) b c)) 353 | > uncurry :: (a ~> (Exp (~>) b c)) -> ((Prod (~>) a b) ~> c) 354 | 355 | } 356 | 357 | \framet{GHC Core}{ 358 | 359 | \pause 360 | 361 | > data Expr b -- ``b'' for the type of binders, 362 | > = Var Id 363 | > | Lit Literal 364 | > | App (Expr b) (Expr b) 365 | > | Lam b (Expr b) 366 | > | Let (Bind b) (Expr b) 367 | > | Case (Expr b) b Type [Alt b] 368 | > | Cast (Expr b) Coercion 369 | > | Type Type 370 | > 371 | > type Alt b = (AltCon, [b], Expr b) 372 | > 373 | > data AltCon = DataAlt DataCon | LitAlt Literal | DEFAULT 374 | > 375 | > data Bind b = NonRec b (Expr b) | Rec [(b, Expr b)] 376 | 377 | } 378 | 379 | \framet{Lambda term GADT}{ 380 | 381 | > data E :: * -> * SPACE where 382 | > Var :: V a -> E a 383 | > Const :: Prim a -> E a 384 | > App :: E (a -> b) -> E a -> E b 385 | > Lam :: Pat a -> E b -> E (a -> b) 386 | 387 | > data Pat :: * -> * SPACE where 388 | > UnitPat :: Pat Unit 389 | > VarPat :: V a -> Pat a 390 | > PairPat :: Pat a -> Pat b -> Pat (a :* b) 391 | 392 | } 393 | 394 | \framet{Lambda to CCC}{ 395 | 396 | > (\ p -> k) :=> const k 397 | > (\ p -> v) :=> ... -- accessor 398 | > (\ p -> u v) :=> apply . ((\ p -> u) &&& (\ p -> v)) 399 | > (\ p -> \ q -> u) :=> curry (\ (p,q) -> u) 400 | 401 | \pause 402 | 403 | > convert :: CCC (~>) => Pat a -> E b -> (a ~> b) 404 | > convert _ (Const x) = constArrow x 405 | > convert p (Var v) = convertVar p v 406 | > convert p (App u v) = apply . (convert p u &&& convert p v) 407 | > convert p (Lam q e) = curry (convert (PairPat p q) e) 408 | 409 | %% \hrefc{https://github.com/ku-fpg/lambda-ccc/blob/master/src/LambdaCCC/ToCCC.hs}{source} 410 | 411 | } 412 | 413 | \framet{Circuit CCC}{ 414 | 415 | > data Comp = forall a b. Comp (Prim a b) (Buses a) (Buses b) 416 | > 417 | > type CircuitM = WriterT (Seq Comp) (State BusSupply) 418 | 419 | > newtype a :> b = Circ (Buses a -> CircuitM (Buses b)) 420 | 421 | > instance Category (:>) where ... 422 | > instance ProductCat (:>) where ... 423 | > instance ClosedCat (:>) where ... 424 | 425 | } 426 | 427 | \partframe{Examples} 428 | 429 | %if False 430 | \framet{|sumSquare :: RTree N2 Int -> Int|}{ 431 | 432 | \begin{center} 433 | \begin{minipage}[c]{0.3\textwidth}\ \end{minipage} 434 | \begin{minipage}[c]{0.5\textwidth} 435 | 436 | > sumSquare = sum . fmap square 437 | 438 | \end{minipage} 439 | \end{center} 440 | 441 | \vspace{-10ex} 442 | \wfig{5in}{figures/sumSquare-t2} 443 | 444 | } 445 | %endif 446 | 447 | \framet{|sumSquare :: RTree N2 Int -> Int|}{ 448 | 449 | \pause 450 | 451 | \begin{center} 452 | {\tiny 453 | \begin{verbatim} 454 | 455 | uncurry (apply . (curry (apply . (curry (apply . (curry (apply . (curry (curry 456 | (apply . (curry (apply . (apply . (curry (curry (uncurry add) . exr) . it &&& 457 | apply . (curry (repr . exr) . it &&& apply . (((((id . exr) . exl) . exl) . exl) 458 | . id *** (id . exl) . id))) &&& apply . (curry (repr . exr) . it &&& apply . 459 | (((((id . exr) . exl) . exl) . exl) . id *** (id . exr) . id)))) &&& apply . 460 | (curry (repr . exr) . it &&& apply . (curry (apply . (curry (abst . exr) . it 461 | &&& apply . (apply . (curry (curry id . exr) . it &&& apply . (((id . exr) . 462 | exl) . id *** (id . exl) . id)) &&& apply . (((id . exr) . exl) . id *** (id . 463 | exr) . id)))) &&& apply . (curry (repr . exr) . it &&& apply . (curry (repr . 464 | exr) . it &&& id . exr))))))) &&& curry (apply . (curry (abst . exr) . it &&& 465 | apply . (curry (apply . (curry (abst . exr) . it &&& apply . (apply . (curry 466 | (curry id . exr) . it &&& apply . (((id . exr) . exl) . id *** (id . exl) . id)) 467 | &&& apply . (((id . exr) . exl) . id *** (id . exr) . id)))) &&& apply . (curry 468 | (repr . exr) . it &&& apply . (curry (repr . exr) . it &&& id . exr))))))) &&& 469 | curry (apply . (curry (apply . (curry (abst . exr) . it &&& apply . (apply . 470 | (curry (curry (uncurry mul) . exr) . it &&& id . exr) &&& id . exr))) &&& apply 471 | . (curry (repr . exr) . it &&& id . exr))))) &&& curry (apply . (curry (apply . 472 | (curry (abst . exr) . it &&& apply . (apply . (curry (curry (uncurry add) . exr) 473 | . it &&& apply . (curry (repr . exr) . it &&& apply . (((id . exr) . exl) . id 474 | *** (id . exl) . id))) &&& apply . (curry (repr . exr) . it &&& apply . (((id . 475 | exr) . exl) . id *** (id . exr) . id))))) &&& apply . (curry (repr . exr) . it 476 | &&& apply . (curry (repr . exr) . it &&& id . exr)))))) &&& curry (apply . 477 | (curry (abst . exr) . it &&& apply . (curry (repr . exr) . it &&& id . exr))))) 478 | . (it &&& id) 479 | 480 | \end{verbatim} 481 | } 482 | \end{center} 483 | } 484 | 485 | \framet{|sumSquare :: RTree N2 Int -> Int|}{ 486 | 487 | \begin{minipage}[c]{0.0\textwidth} 488 | {\tiny 489 | \begin{verbatim} 490 | module sumSquare-t2 (In_0, In_1, In_2, In_3, Out); 491 | input [0:31] In_0; 492 | input [0:31] In_1; 493 | input [0:31] In_2; 494 | input [0:31] In_3; 495 | output [0:31] Out; 496 | wire [0:31] w_mul_I1; 497 | wire [0:31] w_mul_I2; 498 | wire [0:31] w_mul_I3; 499 | wire [0:31] w_mul_I4; 500 | wire [0:31] w_add_I5; 501 | wire [0:31] w_add_I6; 502 | wire [0:31] w_add_I7; 503 | assign w_mul_I1 = In_0 * In_0; 504 | assign w_mul_I2 = In_1 * In_1; 505 | assign w_mul_I3 = In_2 * In_2; 506 | assign w_mul_I4 = In_3 * In_3; 507 | assign w_add_I5 = w_mul_I1 + w_mul_I2; 508 | assign w_add_I6 = w_mul_I3 + w_mul_I4; 509 | assign w_add_I7 = w_add_I5 + w_add_I6; 510 | assign Out = w_add_I7; 511 | endmodule 512 | \end{verbatim} 513 | } 514 | \end{minipage} 515 | \hspace{-10ex} 516 | \begin{minipage}[c]{0.5\textwidth} 517 | \wfig{3in}{figures/sumSquare-t2} 518 | \end{minipage} 519 | } 520 | 521 | %if False 522 | \framet{|\ (a,b) -> a+b :: Int|}{\parskip3ex 523 | 524 | \begin{center} 525 | \begin{minipage}[c]{0.45\textwidth} 526 | \wfig{2.3in}{figures/sum-2} 527 | \end{minipage} 528 | \begin{minipage}[c]{1\textwidth} 529 | 530 | {\small 531 | \begin{verbatim} 532 | module sum-2 (In_0, In_1, Out); 533 | input [0:31] In_0; 534 | input [0:31] In_1; 535 | output [0:31] Out; 536 | wire [0:31] w_add_I1; 537 | assign w_add_I1 = In_0 + In_1; 538 | assign Out = w_add_I1; 539 | endmodule 540 | \end{verbatim} 541 | } 542 | \end{minipage} 543 | \end{center} 544 | } 545 | %endif 546 | 547 | %if False 548 | 549 | \framet{|\ (a,b,c,d) -> a+b+c+d :: Int|}{ 550 | \vspace{-1ex} 551 | \wfig{3.45in}{figures/sum-4a} 552 | } 553 | 554 | \framet{|\ (a,b,c,d) -> (a+b)+(c+d) :: Int|}{ 555 | %\vspace{-2ex} 556 | \wfig{3.75in}{figures/sum-4b} 557 | } 558 | 559 | %endif 560 | 561 | \framet{Uniform pairs}{ 562 | 563 | \vspace{8ex} 564 | 565 | > data Pair a = a :# a 566 | 567 | \vspace{8ex} 568 | 569 | |Functor|, |Applicative|, |Monad|, |Foldable|, |Traversable|. 570 | 571 | } 572 | 573 | \framet{|sum :: Pair Int -> Int|}{ 574 | \wfig{4in}{figures/sum-p} 575 | } 576 | 577 | \framet{|sumSquare :: Pair Int -> Int|}{ 578 | %\vspace{-2ex} 579 | \wfig{4in}{figures/sumSquare-p} 580 | } 581 | 582 | \framet{Length-typed vectors}{ 583 | 584 | > data VecTy :: Nat -> * -> * SPACE where 585 | > ZVec :: Vec Z a 586 | > (:<) :: a -> Vec n a -> Vec (S n) a 587 | 588 | \pause 589 | \vspace{-5ex} 590 | 591 | > instance Functor (Vec n) where 592 | > fmap _ ZVec = ZVec 593 | > fmap f (a :< u) = f a :< fmap f u 594 | > 595 | > instance Foldable (Vec n) where 596 | > foldMap _ ZVec = mempty 597 | > foldMap h (a :< as) = h a <> foldMap h as 598 | 599 | And |Applicative|, |Monad|, |Traversable|. 600 | 601 | } 602 | 603 | \framet{|fmap not :: Vec N6 Bool -> Vec N6 Bool|}{ 604 | \vspace{-4.2ex} 605 | \wfig{3in}{figures/map-v6} 606 | } 607 | 608 | \framet{|sum :: Vec N6 Int -> Int|}{ 609 | \vspace{-1ex} 610 | \wfig{4.8in}{figures/sum-v6-0} 611 | } 612 | 613 | \framet{|sum :: Vec N6 Int -> Int| --- optimized}{ 614 | \vspace{-1ex} 615 | \wfig{4.8in}{figures/sum-v6} 616 | } 617 | 618 | \framet{Depth-typed trees (top-down)}{ 619 | 620 | > data RTreeTy :: Nat -> * -> * SPACE where 621 | > L :: a -> RTree Z a 622 | > B :: Pair (RTree n a) -> RTree (S n) a 623 | 624 | \pause 625 | \vspace{-5ex} 626 | 627 | > instance Functor (RTree n) where 628 | > fmap f (L a ) = L (f a) 629 | > fmap f (B ts ) = B ((fmap.fmap) f ts) 630 | > 631 | > instance Foldable (RTree n) where 632 | > foldMap f (L a ) = f a 633 | > foldMap f (B ts ) = (foldMap.foldMap) f ts 634 | 635 | And |Applicative|, |Monad|, |Traversable|. 636 | 637 | Easily generalize beyond |Pair|. 638 | 639 | } 640 | 641 | \framet{Depth-typed trees (bottom-up)}{ 642 | 643 | > data LTreeTy :: Nat -> * -> * SPACE where 644 | > L :: a -> LTree Z a 645 | > B :: LTree n (Pair a) -> LTree (S n) a 646 | 647 | % \pause 648 | \vspace{-5ex} 649 | 650 | > instance Functor (LTree n) where 651 | > fmap f (L a ) = L (f a) 652 | > fmap f (B ts ) = B ((fmap.fmap) f ts) 653 | > 654 | > instance Foldable (LTree n) where 655 | > foldMap f (L a ) = f a 656 | > foldMap f (B ts ) = (foldMap.foldMap) f ts 657 | 658 | And |Applicative|, |Monad|, |Traversable|. 659 | 660 | Easily generalize beyond |Pair|. 661 | 662 | } 663 | 664 | \framet{|fmap not :: RTree N3 Bool -> RTree N3 Bool|}{ 665 | \vspace{-3.5ex} 666 | \wfig{2.3in}{figures/map-t3} 667 | } 668 | 669 | \framet{|sum :: RTree N4 Int -> Int|}{ 670 | \vspace{-2ex} 671 | \wfig{3.6in}{figures/sum-t4} 672 | } 673 | 674 | \framet{|sum :: RTree N3 Int -> Int|}{ 675 | 676 | \vspace{-1ex} 677 | Monomorphized \& simplified GHC Core: 678 | 679 | {\tiny 680 | 681 | > let f0 :: RTree N0 Int -> Sum Int 682 | > f0 = \ ds -> 683 | > abst ZfRepSum (repr ZfRepTree0 ds) 684 | > f1 :: RTree N1 Int -> Sum Int 685 | > f1 = \ ds -> 686 | > case repr ZfRepPair (repr ZfRepTree ds) of 687 | > (,) a b -> 688 | > abst ZfRepSum 689 | > (ZfNumInt_ZcP (repr ZfRepSum (f0 a)) 690 | > (repr ZfRepSum (f0 b))) 691 | > f2 :: RTree N2 Int -> Sum Int 692 | > f2 = \ ds -> 693 | > case repr ZfRepPair (repr ZfRepTree ds) of 694 | > (,) a b -> 695 | > abst ZfRepSum 696 | > (ZfNumInt_ZcP (repr ZfRepSum (f1 a)) 697 | > (repr ZfRepSum (f1 b))) 698 | > in SPACE \ eta -> 699 | > repr ZfRepSum 700 | > (case repr ZfRepPair (repr ZfRepTree eta) of 701 | > (,) a b -> 702 | > abst ZfRepSum 703 | > (ZfNumInt_ZcP (repr ZfRepSum (f2 a)) 704 | > (repr ZfRepSum (f2 b)))) 705 | 706 | } 707 | } 708 | 709 | \framet{Dot products}{ 710 | 711 | > dot :: (Traversable g, Foldable f, Applicative f, Num a) => 712 | > g (f a) -> a 713 | > dot = sum . fmap product . transpose 714 | 715 | where 716 | 717 | > transpose :: (Traversable g, Applicative f) => g (f a) -> f (g a) 718 | 719 | also called |sequenceA| from |Traversable|. 720 | 721 | For |dot|, typically |g == Pair|. 722 | 723 | } 724 | 725 | \framet{|transpose :: Pair (RTree N4 Int) -> RTree N4 (Pair Int)|}{ 726 | \vspace{-3ex} 727 | \wfig{1.83in}{figures/transpose-pt4} 728 | } 729 | 730 | \framet{|transpose :: RTree N4 (Pair Int) -> Pair (RTree N4 Int)|}{ 731 | \vspace{-3ex} 732 | \wfig{1.83in}{figures/transpose-t4p} 733 | } 734 | 735 | %if False 736 | \framet{|dot :: Pair (RTree N1 Int) -> Int|}{ 737 | \vspace{-2ex} 738 | \wfig{4.1in}{figures/dotsp-pt1} 739 | } 740 | %endif 741 | 742 | \framet{|dot :: Pair (RTree N2 Int) -> Int|}{ 743 | \vspace{-2ex} 744 | \wfig{4.8in}{figures/dotsp-pt2} 745 | } 746 | 747 | %if False 748 | 749 | \framet{|dot :: Pair (RTree N3 Int) -> Int|}{ 750 | \vspace{-3ex} 751 | \wfig{3.25in}{figures/dotsp-pt3} 752 | } 753 | 754 | \framet{|dot :: Pair (RTree N4 Int) -> Int|}{ 755 | \vspace{-2ex} 756 | \wfig{3in}{figures/dotsp-pt4} 757 | } 758 | 759 | \framet{|dot :: Vec N3 (RTree N2 Int) -> Int|}{ 760 | \vspace{-3ex} 761 | \wfig{3.3in}{figures/dotsp-v3t2} 762 | } 763 | 764 | \framet{|dot :: RTree N2 (RTree N2 Int) -> Int|}{ 765 | \vspace{-3ex} 766 | \wfig{3.3in}{figures/dotsp-t2t2} 767 | } 768 | 769 | %endif 770 | 771 | \framet{Linear transformations}{ 772 | 773 | > (<.>) :: (Foldable f, Num (f a), Num a) => f a -> f a -> a 774 | > u <.> v = dot (u :# v) 775 | 776 | \pause 777 | 778 | > type Matrix m n a = Vec n (Vec m a) 779 | 780 | > ($@) :: (IsNat m, Num a) => Matrix m n a -> Vec m a -> Vec n a 781 | > mat $@ vec = (<.> vec) <$> mat 782 | 783 | } 784 | 785 | \framet{|($@) :: Matrix N2 N3 Int -> Vec N2 Int -> Vec N3 Int|}{ 786 | \vspace{-3ex} 787 | \wfig{4in}{figures/applyLin-v23} 788 | } 789 | 790 | \framet{|($@) :: Matrix N4 N2 Int -> Vec N4 Int -> Vec N2 Int|}{ 791 | \vspace{-0ex} 792 | \wfig{4.5in}{figures/applyLin-v42} 793 | } 794 | 795 | \framet{|Generalizing linear transformations|}{ 796 | 797 | > ($@) :: (IsNat m, Num a) => 798 | > Vec n (Vec m a) -> Vec m a -> Vec n a 799 | > mat $@ vec = (<.> vec) <$> mat 800 | 801 | More simply and generally, 802 | 803 | > ($@) :: (Foldable m, Applicative m, Functor n, Num a) => 804 | > n (m a) -> m a -> n a 805 | 806 | For instance, 807 | 808 | > type MatrixT m n a = RTree n (RTree m a) 809 | 810 | } 811 | 812 | \framet{|($@) :: MatrixT N2 N1 Int -> RTree N2 Int -> RTree N1 Int|}{ 813 | \vspace{-1ex} 814 | \wfig{4.5in}{figures/applyLin-t21} 815 | } 816 | 817 | \framet{|($@) :: MatrixT N2 N2 Int -> RTree N2 Int -> RTree N2 Int|}{ 818 | \vspace{-1ex} 819 | \wfig{2.75in}{figures/applyLin-t22} 820 | } 821 | 822 | \framet{Composing linear transformations}{ 823 | 824 | Transform columns: 825 | 826 | > (.@) :: (IsNat m, IsNat n, IsNat o, Num a) => 827 | > Matrix n o a -> Matrix m n a -> Matrix m o a 828 | > no .@ mn = transpose ((no SSPACE $@) <$> transpose mn) 829 | 830 | More simply and generally, 831 | 832 | > (.@) :: ( Applicative o, Traversable n, Applicative n 833 | > , Traversable m, Applicative m, Num a ) => 834 | > o (n a) -> n (m a) -> o (m a) 835 | 836 | } 837 | 838 | \framet{|(.@) :: Matrix N3 N4 Int -> Matrix N2 N3 Int -> Matrix N2 N4 Int|}{ 839 | \vspace{-1ex} 840 | \wfig{2.3in}{figures/composeLin-v234} 841 | } 842 | 843 | \framet{|(.@) :: MatrixT N2 N2 Int -> MatrixT N2 N2 Int -> MatrixT N2 N2 Int|}{ 844 | \vspace{-1ex} 845 | \wfig{1.45in}{figures/composeLin-t222} 846 | } 847 | 848 | \framet{|(.@) :: MatrixT N3 N2 Int -> MatrixT N2 N3 Int -> MatrixT N2 N2 Int|}{ 849 | \vspace{-1ex} 850 | \wfig{1.25in}{figures/composeLin-t232} 851 | } 852 | 853 | \framet{Pair sort}{ 854 | 855 | \vspace{2ex} 856 | 857 | > sortP :: Ord a => Unop (Pair a) 858 | > sortP (a :# b) = if a <= b then a :# b else b :# a 859 | 860 | \vspace{-6ex} 861 | 862 | \wfig{4.2in}{figures/bitonic-up-1} 863 | } 864 | 865 | \framet{Bitonic sort}{ 866 | 867 | > bsort :: (IsNat n, Ord a) => Unop (RTree n a) 868 | > bsort = bsort' nat 869 | > 870 | > bsort' :: Ord a => Nat n -> Unop (RTree n a) 871 | > bsort' Zero = id 872 | > bsort' (Succ m) = \ (B ts) -> 873 | > merge (Succ m) (B (secondP reverse (bsort' m <$> ts))) 874 | > 875 | > merge :: Ord a => Nat n -> Unop (RTree n a) 876 | > merge n = butterfly' n sortP 877 | 878 | > butterfly' :: Ord a => Nat n -> Unop (Pair a) -> Unop (RTree n a) 879 | > butterfly' Zero _ = id 880 | > butterfly' (Succ m) f = 881 | > inB (fmap (butterfly' m f) . (inTranspose.fmap) f) 882 | 883 | } 884 | 885 | \framet{Bitonic sort --- depth 2}{ 886 | \vspace{-3ex} 887 | \wfig{4.75in}{figures/bitonic-up-2} 888 | } 889 | 890 | \framet{Bitonic sort --- depth 3}{ 891 | \vspace{-5ex} 892 | \wfig{4.75in}{figures/bitonic-up-3} 893 | } 894 | 895 | \framet{Bitonic sort --- depth 4}{ 896 | \vspace{-1ex} 897 | \wfig{3.75in}{figures/bitonic-up-4} 898 | } 899 | 900 | \framet{Parallel scan} { 901 | 902 | > class Functor f => LScan f where 903 | > lscan :: Monoid a => f a -> f a :* a 904 | 905 | Instances for functor combinators: |Const|, |Id|, |(:*)|, |(:+)|, |(:.)|. 906 | 907 | Specializations: 908 | 909 | > lsums :: (LScan f, Num a) => f a -> f a :* a 910 | > lsums = (fmap getSum *** getSum) . lscan . fmap Sum 911 | > 912 | > lsums' :: (LScan f, Traversable f, Num b) => Unop (f b) 913 | > lsums' = snd . shiftR . lsums 914 | 915 | %if False 916 | 917 | > lproducts :: (LScan f, Num a) => f a -> f a :* a 918 | > lproducts = (fmap getProduct *** getProduct) . lscan . fmap Product 919 | 920 | %endif 921 | 922 | etc. 923 | 924 | } 925 | 926 | \framet{|lsums' :: Unop (RTree N4 Int)|}{ 927 | \vspace{-2ex} 928 | \wfig{3.3in}{figures/lsumsp-rt4} 929 | } 930 | 931 | \framet{|lsums' :: Unop (RTree N5 Int)|}{ 932 | \vspace{-4ex} 933 | \wfig{2.6in}{figures/lsumsp-rt5} 934 | } 935 | 936 | \framet{|lsums' :: Unop (LTree N4 Int)|}{ 937 | \vspace{-1.3ex} 938 | \wfig{4.5in}{figures/lsumsp-lt4} 939 | } 940 | 941 | %if False 942 | \framet{Powers}{ 943 | 944 | > powers :: (LScan f, Applicative f, Num a) => a -> f a 945 | > powers = fst . lproducts . pure 946 | 947 | \pause 948 | 949 | \vspace{8ex} 950 | 951 | |RTree N4 Int|: 952 | 953 | \vspace{-22ex} 954 | 955 | \wfig{3.2in}{figures/powers-rt4} 956 | } 957 | 958 | %else 959 | \framet{Powers}{ 960 | 961 | > powers :: (LScan f, Applicative f, Num a) => a -> f a 962 | > powers = fst . lproducts . pure 963 | 964 | } 965 | 966 | \framet{|powers :: Int -> RTree N4 Int| --- unoptimized}{ 967 | \vspace{-2ex} 968 | \wfig{4in}{figures/powers-rt4-no-opt} 969 | } 970 | \framet{|powers :: Int -> RTree N4 Int| --- optimized}{ 971 | \wfig{4.5in}{figures/powers-rt4} 972 | } 973 | 974 | %endif 975 | 976 | \framet{Polynomial evaluation}{ 977 | 978 | > evalPoly :: (LScan f, Applicative f, Foldable f, Num a) => 979 | > f a -> a -> a 980 | > evalPoly coeffs x = coeffs <.> powers x 981 | 982 | } 983 | 984 | \framet{|evalPoly :: RTree N4 Int -> Int -> Int|}{ 985 | \vspace{0ex} 986 | \wfig{4.7in}{figures/evalPoly-rt4} 987 | } 988 | 989 | \framet{Synchronous stream transformers}{ 990 | 991 | % > data Mealy a b = forall s. C s => Mealy ((a,s) -> (b,s)) s 992 | 993 | > data Mealy a b = forall s. Mealy ((a,s) -> (b,s)) s 994 | 995 | Semantics: 996 | 997 | > asStreamFun :: Mealy a b -> StreamArrow (->) a b 998 | > asStreamFun (Mealy f s0) = StreamArrow (go s0) 999 | > where 1000 | > go s (Cons a as) = Cons b (go s' as) where (b,s') = f (a,s) 1001 | 1002 | Much more generally: 1003 | 1004 | > asArrow :: ArrowCircuit k => Mealy a b -> (a `k` b) 1005 | > asArrow (Mealy f s0) = loop (arr f . second (delay s0)) 1006 | 1007 | Semantic homomorphism for `Category`, `Arrow`, etc. 1008 | 1009 | } 1010 | 1011 | \framet{Fibonacci}{ 1012 | 1013 | > fib :: Num a => Mealy () a 1014 | 1015 | Equivalent definitions: 1016 | 1017 | > fib = Mealy (\ ((),(a,b)) -> (a,(b,a+b))) (0,1) 1018 | 1019 | > fib = loop (arr (\ ((),(a,b)) -> (a,(b,a+b))) . second (delay (0,1))) 1020 | 1021 | > fib = proc () -> do rec (a,b) <- delay (0,1) -< (b,a+b) 1022 | > returnA -< a 1023 | 1024 | > fib = proc () -> do rec a <- delay 0 -< b 1025 | > b <- delay 1 -< a+b 1026 | > returnA -< a 1027 | 1028 | } 1029 | 1030 | \framet{Fibonacci}{ 1031 | \vspace{-2ex} 1032 | \wfig{4.7in}{figures/fibS} 1033 | } 1034 | 1035 | \framet{Shift register}{ 1036 | 1037 | > shiftR :: Traversable t => t a :* a -> a :* t a 1038 | > shiftR (as,a') = mapAccumR (flip (,)) a' as 1039 | 1040 | > shiftRS :: Traversable f => f a -> Mealy a a 1041 | > shiftRS = Mealy (shiftR . swap) 1042 | 1043 | %% \vspace{-2ex} 1044 | 1045 | \wfig{4.7in}{figures/shiftR-iota-v3} 1046 | } 1047 | 1048 | %if False 1049 | \framet{CRC}{ 1050 | \vspace{-2ex} 1051 | \wfig{2.2in}{figures/crcSKpp-rt2-shallow-delay-with-depths} 1052 | } 1053 | %else 1054 | \framet{Cyclic redundancy check}{ 1055 | 1056 | > crc :: (Applicative poly, Traversable poly) => 1057 | > poly Bool -> Mealy Bool (poly Bool) 1058 | > crc poly = scanl step (pure False) 1059 | > where 1060 | > step seg b0 = if b0' then liftA2 xor poly seg' else seg' 1061 | > where 1062 | > (b0',seg') = shiftR (seg,b0) 1063 | 1064 | } 1065 | 1066 | \framet{|crc polyD :: Mealy Bool (RTree N2 Bool)| --- unoptimized}{ 1067 | \wfig{4.5in}{figures/crcSKf-rt2-no-opt} 1068 | } 1069 | 1070 | \framet{|crc polyD :: Mealy Bool (RTree N2 Bool)| --- optimized}{ 1071 | \wfig{4.5in}{figures/crcSKf-rt2} 1072 | } 1073 | 1074 | %endif 1075 | 1076 | \framet{Status and future}{ 1077 | 1078 | \begin{itemize}\parskip1ex 1079 | \item Although Tabula has closed, I'd like the project to continue. 1080 | \item Open source \href{https://github.com/conal/lambda-ccc/}{on GitHub} 1081 | \item To do: 1082 | \begin{itemize}\parskip1ex 1083 | \item Compiler performance 1084 | \item More examples 1085 | % \item Genuine sums for circuits 1086 | \item Memory and computation management 1087 | \item More interpretations (CCCs) 1088 | \end{itemize} 1089 | \end{itemize} 1090 | } 1091 | 1092 | \end{document} 1093 | -------------------------------------------------------------------------------- /macros.tex: -------------------------------------------------------------------------------- 1 | %% To do: trim these definitions 2 | 3 | \newcommand\nc\newcommand 4 | \nc\rnc\renewcommand 5 | 6 | \usepackage{epsfig} 7 | \usepackage{latexsym} 8 | %% \usepackage{bbold} %% for $\mathbbm{1}$ 9 | 10 | \usepackage{color} 11 | \definecolor{darkblue}{rgb}{0,0,0.6} 12 | 13 | %% %% Look for the \smalltriangleup definition. I expected it in amssymb 14 | %% \nc\smalltriangleup{\scriptscriptstyle \triangle} 15 | %% \nc\smalltriangledown{\scriptscriptstyle \triangledown} 16 | 17 | \nc\out[1]{} 18 | 19 | \nc\hrefc[2]{\textcolor{darkblue}{\href{#1}{#2}}} 20 | 21 | \nc\mynoteOut[2]{\mynote{#1}\out{#2}} 22 | 23 | % While working, use these defs 24 | %% \nc\mynote[1]{{\em [#1]}} 25 | %% \nc\mynotefoot[1]{\footnote{\mynote{#1}}} 26 | % But for the submission, use these 27 | \nc\mynote\out 28 | \nc\mynotefoot\out 29 | 30 | \nc\todo{\mynote{To do.}} 31 | 32 | \nc\figlabel[1]{\label{fig:#1}} 33 | \nc\figref[1]{Figure~\ref{fig:#1}} 34 | 35 | \nc\seclabel[1]{\label{sec:#1}} 36 | \nc\secref[1]{Section~\ref{sec:#1}} 37 | \nc\secreftwo[2]{Sections~\ref{sec:#1} and~\ref{sec:#2}} 38 | 39 | \nc\appref[1]{Appendix~\ref{sec:#1}} 40 | 41 | %% The name \secdef is already taken 42 | \nc\sectiondef[1]{\section{#1}\seclabel{#1}} 43 | \nc\subsectiondef[1]{\subsection{#1}\seclabel{#1}} 44 | \nc\subsubsectiondef[1]{\subsubsection{#1}\seclabel{#1}} 45 | 46 | \nc\needcite{\mynote{ref}} 47 | 48 | % \nc\myurl\texttt 49 | 50 | % http://cs.wlu.edu/~necaise/refs/latex2e/env-floats.3.html#lnfigure 51 | 52 | % Arguments: env, label, caption, body 53 | \nc\figdefG[4]{\begin{#1}[tbp] 54 | #4 55 | \caption{#3} 56 | \figlabel{#2} 57 | \end{#1}} 58 | 59 | % Arguments: label, caption, body 60 | \nc\figdef{\figdefG{figure}} 61 | \nc\figdefwide{\figdefG{figure*}} 62 | 63 | % Arguments: label, caption, body 64 | \nc\figrefdef[3]{\figref{#1}\figdef{#1}{#2}{#3}} 65 | 66 | \nc\figrefdefwide[3]{\figref{#1}\figdefwide{#1}{#2}{#3}} 67 | 68 | 69 | % Image format: PNG or JPEG? JPEG lets us shrink the files, at some cost 70 | % in fidelity. Png is much slower to process even when the files are 71 | % smaller. I guess there's some conversion process going on. 72 | % JPEG compressed at 35x, the figures are smaller and faster to 73 | % process than png. The eps files are huge (about 80x). 74 | % Since PNG is lossless, keep the master figures in that format and convert. 75 | 76 | 77 | \nc\picext{png} 78 | %\nc\picext{jpg} 79 | %\nc\picext{eps} 80 | %\nc\picext{tif} 81 | 82 | \nc\picfile[1]{pictures/\picext/#1.\picext} 83 | 84 | \nc\pict[1]{\includegraphics[width=3.2in]{\picfile{#1}}} 85 | 86 | \nc\picframe[1]{\frame{\pict{#1}}} 87 | \nc\picframewide[1]{\frame{\includegraphics[width=6in]{\picfile{#1}}}} 88 | 89 | \nc\picdef[2]{\figdef{#1}{#2}{\centering \picframe{#1}}} 90 | \nc\picdefwide[2]{\figdefwide{#1}{#2}{\picframewide{#1}}} 91 | 92 | \nc\picrefdef[2]{\picdef{#1}{#2}\figref{#1}} 93 | \nc\picrefdefwide[2]{\figref{#1}\picdefwide{#1}{#2}} 94 | 95 | \nc\figneeded[1]{\figdef{needed}{#1}} 96 | 97 | \nc\symTwo[1]{\mathbin{#1\!\!\!#1}} 98 | \nc\symThree[1]{\mathbin{#1\!\!\!#1\!\!\!#1}} 99 | 100 | \nc{\lb}{[\![} 101 | \nc{\rb}{]\!]} 102 | \nc{\db}[1]{\lb#1\rb} 103 | 104 | \usepackage{tikz} 105 | %%%< 106 | %% \usepackage[active,tightpage]{preview} 107 | %% \PreviewEnvironment{tikzpicture} 108 | %%%> 109 | \usepackage{amsmath} 110 | 111 | %% \usepackage{tikz-cd} 112 | 113 | %% % I used tikz-cd version 0.3c, of December 30, 2012. 114 | %% % July 2012 version lacks a feature I use (shift left). 115 | 116 | %% \usetikzlibrary{matrix, calc, arrows} 117 | %% \tikzset{ ampersand replacement=\& } 118 | 119 | \nc\wpicture[2]{\includegraphics[width=#1]{#2}} 120 | 121 | \nc\wfig[2]{ 122 | \begin{center} 123 | \wpicture{#1}{#2} 124 | \end{center} 125 | } 126 | \nc\fig[1]{\wfig{4in}{#1}} 127 | 128 | \nc\usebg[1]{\usebackgroundtemplate{\wpicture{1.2\textwidth}{#1}}} 129 | 130 | \nc\framet[2]{\frame{\frametitle{#1}#2}} 131 | 132 | \nc\hidden[1]{} 133 | 134 | \nc\Back{\!\!\!\!\!\!\!} 135 | 136 | % For arrow notation: pat <- arr -< exp 137 | \nc\leftarrowTailForArrow{\mathbin{-\!\!\!\prec}} 138 | %% a nicer match than \leftarrow 139 | \nc\leftarrowForArrow{\mathbin{\prec\!\!\!\!\mbox{---}}} 140 | -------------------------------------------------------------------------------- /makefile: -------------------------------------------------------------------------------- 1 | TARG = haskell-to-hardware 2 | 3 | PDFs = figures/applyLin-t21.pdf figures/applyLin-t22.pdf figures/applyLin-v23.pdf figures/applyLin-v34.pdf figures/applyLin-v42.pdf figures/applyLin-v45.pdf figures/bitonic-up-1.pdf figures/bitonic-up-2.pdf figures/bitonic-up-3.pdf figures/bitonic-up-4.pdf figures/composeLin-t222.pdf figures/composeLin-t232.pdf figures/composeLin-v234.pdf figures/crcSKf-rt2-no-opt.pdf figures/crcSKf-rt2.pdf figures/dotsp-pt1.pdf figures/dotsp-pt2.pdf figures/dotsp-pt3.pdf figures/dotsp-pt4.pdf figures/dotsp-t2t2.pdf figures/dotsp-v3t2.pdf figures/evalPoly-rt4.pdf figures/fibS.pdf figures/lsumsp-lt4.pdf figures/lsumsp-rt4.pdf figures/lsumsp-rt5.pdf figures/map-t3.pdf figures/map-t4.pdf figures/map-v6.pdf figures/powers-rt4-no-opt.pdf figures/powers-rt4.pdf figures/shiftR-iota-v3.pdf figures/sum-2.pdf figures/sum-4a.pdf figures/sum-4b.pdf figures/sum-p.pdf figures/sum-t4.pdf figures/sum-v6-0.pdf figures/sum-v6.pdf figures/sumSquare-p.pdf figures/sumSquare-t2.pdf figures/sumSquare-t3.pdf figures/sumSquare-t4.pdf figures/transpose-pt4.pdf figures/transpose-t4p.pdf 4 | 5 | # figs: $(PDFs) 6 | 7 | .PRECIOUS: %.tex %.pdf %.web 8 | 9 | all: $(TARG).pdf 10 | 11 | see: $(TARG).see 12 | 13 | figures: 14 | mkdir figures 15 | 16 | figures/%.pdf: dots/%.dot figures 17 | dot -Tpdf $< -o $@ 18 | 19 | $(TARG).pdf: $(TARG).tex makefile $(PDFs) 20 | pdflatex $(TARG).tex 21 | 22 | # --poly is default for lhs2TeX 23 | 24 | %.tex: %.lhs macros.tex mine.fmt makefile 25 | lhs2TeX -o $*.tex $*.lhs 26 | 27 | showpdf = open -a Skim.app 28 | 29 | %.see: %.pdf 30 | ${showpdf} $*.pdf 31 | 32 | clean: 33 | rm $(TARG).{tex,pdf,aux,nav,snm,ptb} 34 | 35 | web: web-token 36 | 37 | web-token: $(TARG).pdf 38 | scp $? conal@conal.net:/home/conal/web/talks 39 | touch $@ 40 | -------------------------------------------------------------------------------- /mine.fmt: -------------------------------------------------------------------------------- 1 | %% Misc lhs2TeX directives 2 | 3 | %% %format Unit = " \mathbbm{1} " 4 | %% %format Unit = " \mathbf{1} " 5 | %format Unit = () 6 | %format :* = " \times " 7 | %format :+ = " + " 8 | %format :. = " \circ " 9 | 10 | %format <> = " \mathbin{\oplus} " 11 | %format `mappend` = " \mathbin{\oplus} " 12 | %format mempty = epsilon 13 | 14 | %format <$> = "\mathbin{<\!\!\!\$\!\!\!>}" 15 | 16 | % Got from Andres L: 17 | \newcommand{\calculationcomments}{% 18 | \let\onelinecomment=\onelinecommentchars 19 | \def\commentbegin{\quad\{ }% 20 | \def\commentend{\}}% 21 | } 22 | \calculationcomments 23 | 24 | %% hack: add missing space, e.g., before "{" in data type decl 25 | %format SPACE = "\ {}" 26 | %% Small space 27 | %format SSPACE = "{}" 28 | 29 | %format PAUSE = "\pause " 30 | 31 | %format BACK = "{\Back}" 32 | %format BACKQ a = "{\Back}" 33 | %format PBACK = "\pause\Back" 34 | 35 | % \renewcommand{\onelinecomment}{\it} 36 | 37 | %% %format (meaning (a)) = "\db{" a "}" 38 | %% %format meaning' (a) x = "\db{" a "}" x 39 | 40 | %format meaning = mu 41 | %format meaning' = mu 42 | %format meaningInv = mu "^{-1}" 43 | 44 | %% %format Meaning = "\Mu" 45 | %% %format meaning = "\mu" 46 | 47 | %% %format Lin1 = Lin "_1" 48 | 49 | %% %format idL = "\Varid{id_L}" 50 | %format idL = "\widehat{" id "}" 51 | 52 | %format @. = "\mathbin{\hat{\circ}}" 53 | %format @* = "\mathbin{\times}" 54 | 55 | %format NO = "{}" 56 | 57 | %format -* = "\multimap" 58 | 59 | %format :-* = "\mathbin{:"-*"}" 60 | 61 | %% %format :-* = "\mathbin{\mathtt{:\!\!-\!*}}" 62 | 63 | 64 | %format Lin = "(":-*")" 65 | 66 | %format :&& = "\mathbin{:\!"&&&"}" 67 | %format :|| = "\mathbin{:\!"|||"}" 68 | 69 | %format *** = "\!\times\!" 70 | %format &&& = "\mathbin{\smalltriangleup}" 71 | %format ||| = "\mathbin{\smalltriangledown}" 72 | %format +++ = "\!+\!" 73 | 74 | %format Prod (k) a b = a "\times_{\hspace{-0.1ex}\scriptscriptstyle{" k "}}" b 75 | %format Coprod (k) a b = a "+_{\hspace{-0.4ex}\scriptscriptstyle{" k "}}" b 76 | %format Exp (k) a b = a "\Rightarrow_{\hspace{-0.4ex}\scriptscriptstyle{" k "}}" b 77 | 78 | %format ~> = "\leadsto" 79 | 80 | %% %format T = "{\cal T}" 81 | %% %format T = "{\cal R}" 82 | %format T = "\mathbb{R}" 83 | 84 | %format R2 = "\mathbb{R}^2" 85 | 86 | %format <$> = "\mathbin{<\!\!\!\$\!\!\!>}" 87 | %format <*> = "\mathbin{<\!\!\!*\!\!\!>}" 88 | 89 | %format :->: = "\twoheadrightarrow" 90 | %format <== = "\Leftarrow" 91 | 92 | %format liftA2 = "\Varid{liftA_2}" 93 | %format liftA3 = "\Varid{liftA_3}" 94 | %format liftA4 = "\Varid{liftA_4}" 95 | 96 | %format lift0 = "\Varid{lift_0}" 97 | %format lift1 = "\Varid{lift_1}" 98 | %format lift2 = "\Varid{lift_2}" 99 | %format lift3 = "\Varid{lift_3}" 100 | %format lift4 = "\Varid{lift_4}" 101 | 102 | % %format :=> = "\mapsto" 103 | %format :=> = "\dashrightarrow" 104 | 105 | %format :> = "\rightarrowtail" 106 | 107 | %format :< = "\triangleleft" 108 | 109 | %format not = "\Varid{not}" 110 | %format :# = "\mathbin{:\!\!\#}" 111 | %% %format cdot = "(\cdot)" 112 | %% %format `cdot` = "\cdot" 113 | %format <.> = "\cdot" 114 | %format $@ = "\mathbin{\hat{\$}}" 115 | %format .@ = "\mathbin{\hat{\circ}}" 116 | 117 | %% %format Matrix = Mat "_V" 118 | %% %format MatrixT = Mat "_T" 119 | %% %format Matrix = Mat 120 | %% %format MatrixT = MatT 121 | 122 | %format Matrix (m) (n) = Mat"_{"m","n"}" 123 | %format MatrixT (m) (n) = MatT"_{"m","n"}" 124 | 125 | %format N0 = 0 126 | %format N1 = 1 127 | %format N2 = 2 128 | %format N3 = 3 129 | %format N4 = 4 130 | %format N5 = 5 131 | %format N6 = 6 132 | %format N7 = 7 133 | %format N8 = 8 134 | 135 | %format VecTy = "\Varid{Vec}" 136 | %% %format TreeTy = "\Varid{Tree}" 137 | %format RTreeTy = "\Varid{RTree}" 138 | %format LTreeTy = "\Varid{\hspace{0.25ex}LTree}" 139 | 140 | %% hspace to make "RTree" and "LTree" right-align 141 | 142 | %format Vec (n) = VecTy"_{"n"}" 143 | %format RTree (n) = RTreeTy"_{"n"}" 144 | %format LTree (n) = LTreeTy"_{"n"}" 145 | 146 | %format Z = 0 147 | %format S n = 1 + n 148 | 149 | %format sequenceA = transpose 150 | 151 | %format ZfRepSum = "\Varid{\$fRepSum}" 152 | %format ZfRepPair = "\Varid{\$fRepPair}" 153 | %format ZfRepTree0 = "\Varid{\$fRepTree0}" 154 | %format ZfRepTree = "\Varid{\$fRepTree}" 155 | %format ZfNumInt_ZcP = "\Varid{\$fNumInt+}" 156 | 157 | %format f0 = "f_0" 158 | %format f1 = "f_1" 159 | %format f2 = "f_2" 160 | %format f3 = "f_3" 161 | %format f4 = "f_4" 162 | %format f5 = "f_5" 163 | %format f6 = "f_6" 164 | %format f7 = "f_7" 165 | %format f8 = "f_8" 166 | 167 | %format s0 = "s_0" 168 | 169 | %% %format b0 = "b_0" 170 | %% %format b0' = "{b'}_0" 171 | 172 | % The ' gets lost 173 | 174 | %format <- = "\leftarrowForArrow" 175 | %format -< = "\leftarrowTailForArrow " 176 | -------------------------------------------------------------------------------- /notes.md: -------------------------------------------------------------------------------- 1 | 2 | [*From Haskell to hardware via cartesian closed categories*]: http://conal.net/blog/posts/haskell-to-hardware-via-cccs/ "blog post" 3 | 4 | [*Overloading lambda*]: http://conal.net/blog/posts/overloading-lambda "blog post" 5 | 6 | [*Optimizing CCCs*]: http://conal.net/blog/posts/optimizing-cccs "blog post" 7 | 8 | # Haskell to Hardware via CCC 9 | 10 | ## Tabula 11 | 12 | * Post-FPGA reconfigurable hardware. 13 | * Spacetime architecture: 14 | * 3D for shorter paths 15 | * Implemented by rapid reconfiguration (2GHz) 16 | * Minkowski spacetime (special relativity) 17 | * Layout plus scheduling becomes just layout, satisfying causality constraints 18 | * Very high sustained throughput 19 | * Tremendous flexibility for moving computations in space & time 20 | * Program in a non-sequential language: Haskell 21 | 22 | ## Overall plan 23 | 24 | * Use GHC to convert full Haskell to small Core language 25 | * Convert to more abstract representation 26 | * Interpret as circuits 27 | * Translate to hardware description language 28 | * Synthesize & optimize with existing machinery 29 | 30 | ## GHC Core 31 | 32 | Show source code or excerpt from papers 33 | 34 | ## Overloading lambda 35 | 36 | ## (Bi-)Cartesian closed categories 37 | 38 | From category theory: 39 | 40 | * *Category*: identity and composition 41 | * *Cartesian*: products (intro & elim) 42 | * *Closed*: exponentials (arrows as "values") 43 | * *Co-cartisian*: coproducts ("sums") 44 | 45 | ## Category 46 | 47 | ## Converting to CCC form 48 | 49 | ## Circuit CCC 50 | 51 | ## Examples 52 | 53 | ## Status & future 54 | -------------------------------------------------------------------------------- /todo.md: -------------------------------------------------------------------------------- 1 | To do: 2 | 3 | * Show the generated Core for an example. 4 | * Suggest other interpretations (CCCs): 5 | * AD 6 | * Incremental computation 7 | * ?? 8 | * Misc: 9 | * Put new talk version on thumb drive. 10 | * Test dongle. 11 | * Test slide remote. 12 | 13 | Done: 14 | 15 | * Mention the type restriction. 16 | * Show CCC form for an early example after how-it-works overview. 17 | Repeat `sumSquare` example. 18 | --------------------------------------------------------------------------------