├── examples ├── Makefile ├── Setup.hs ├── stack.yaml ├── scan-examples.cabal └── readme.md ├── Figures ├── picard-facepalm.png ├── tinker-toy-bird.jpg ├── beaker-looks-left.png ├── cooley-tukey-general.png └── circuits │ ├── Makefile │ ├── lsums-u.dot │ ├── lsums-i.dot │ ├── lsums-1-0.dot │ ├── lsums-bushp1.dot │ ├── lsums-1-1-0.dot │ ├── lsums-bush0.dot │ ├── lsums-bushp2.dot │ ├── lsums-1-0-no-hash-no-opt.dot │ ├── point-rb4.dot │ ├── lsums-lv4.dot │ ├── lsums-0-1-1-1-1-l.dot │ ├── lsums-1-1-0-no-hash-no-opt.dot │ ├── lsums-bush1.dot │ ├── lsums-lv5.dot │ ├── lsums-1-1-1-1-0-r.dot │ ├── lsums-1-1-1-1-l-no-hash-no-opt.dot │ ├── lsumsp-lv8.dot │ ├── lsums-lv8.dot │ ├── lsums-lv8-wide.dot │ ├── lsums-0-1-1-1-1-l-no-hash-no-opt.dot │ ├── lsums-1-1-1-1-r-no-hash-no-opt.dot │ ├── lsums-1-1-1-1-0-r-no-hash-no-opt.dot │ ├── lsums-lv11.dot │ ├── lsumsp-lv8-and-lv8.dot │ ├── powers-rb4.dot │ ├── lsumsp-lv16.dot │ ├── lsums-lv3olv4-unknown-no-hash.dot │ ├── lsums-lv16.dot │ ├── lsums-lv3olv4.dot │ ├── lsums-lv8-no-hash-no-opt.dot │ ├── lsums-lv3olv4-highlight.dot │ ├── lsums-lv11xlv5.dot │ ├── lsumsp-lv8-lv8-unknown.dot │ ├── lsumsp-p-lv8.dot │ ├── lsumsp-lv8-p.dot │ ├── lsums-lv4olv4-unknown-no-hash.dot │ ├── lsums-p-lv8.dot │ ├── lsums-lv8-lv8-unknown-no-hash.dot │ ├── lsums-lv8-p.dot │ ├── lsums-lv8xlv8.dot │ ├── lsums-lv5-lv11-unknown-no-hash.dot │ ├── lsums-lv5-lv11-unknown-no-hash-highlight.dot │ ├── lsumsp-lv4olv4.dot │ ├── lsumsp-lv5-5-6-l.dot │ ├── lsumsp-rv8.dot │ ├── lsums-lpow-4-2.dot │ ├── lsums-lv4olv4.dot │ ├── lsums-lv5-5-6-l.dot │ ├── lsums-lb4.dot │ ├── lsumsp-lv5xlv11.dot │ ├── lsums-rv8.dot │ ├── lsums-lv5xlv11.dot │ ├── lsumsp-lb4.dot │ ├── dot-rb4.dot │ ├── lsums-lv5xlv11-highlight.dot │ ├── lsumsp-bush2.dot │ ├── lsums-bush2.dot │ ├── lsumsp-lv5-5-6-r.dot │ ├── lsums-rb4.dot │ ├── lsums-lv5-5-6-r.dot │ ├── lsumsp-rb4.dot │ ├── powers-rb4-no-hash.dot │ ├── lproducts-rb4.dot │ ├── scanAdd-lv8.dot │ ├── lsums-rv8-no-hash-no-opt.dot │ ├── evalPoly-rb4.dot │ ├── scanAdd-lb3.dot │ └── scanAdd-rb3.dot ├── .gitignore ├── Makefile ├── todo.md ├── README.md ├── mine.fmt ├── macros.tex ├── notes.md └── discarded.lhs /examples/Makefile: -------------------------------------------------------------------------------- 1 | default: 2 | stack build && stack exec examples 3 | -------------------------------------------------------------------------------- /examples/Setup.hs: -------------------------------------------------------------------------------- 1 | import Distribution.Simple 2 | main = defaultMain 3 | -------------------------------------------------------------------------------- /Figures/picard-facepalm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conal/talk-2016-generic-parallel-scan/HEAD/Figures/picard-facepalm.png -------------------------------------------------------------------------------- /Figures/tinker-toy-bird.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conal/talk-2016-generic-parallel-scan/HEAD/Figures/tinker-toy-bird.jpg -------------------------------------------------------------------------------- /Figures/beaker-looks-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conal/talk-2016-generic-parallel-scan/HEAD/Figures/beaker-looks-left.png -------------------------------------------------------------------------------- /Figures/cooley-tukey-general.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conal/talk-2016-generic-parallel-scan/HEAD/Figures/cooley-tukey-general.png -------------------------------------------------------------------------------- /Figures/circuits/Makefile: -------------------------------------------------------------------------------- 1 | up: 2 | cd ../..; make 3 | 4 | see: 5 | cd ../..; make see 6 | 7 | 8 | pdfs: 9 | cd ../..; make pdfs 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | Junk* 3 | Old* 4 | Stuff 5 | Unused/ 6 | tracings/ 7 | 8 | *.aux 9 | *.log 10 | *.nav 11 | *.out 12 | *.pdf 13 | *.ptb 14 | *.snm 15 | *.toc 16 | 17 | generic-parallel-scan.tex 18 | 19 | web-token 20 | complexity.tex 21 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-u.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_u { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="0.75"; 8 | c1 [label="{0|{}}"]; 9 | c3 [label="{{}|Out}"]; 10 | c1:Out0 -> c3:In0 []; 11 | } 12 | 13 | // No components. 14 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-i.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_i { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="0.75"; 8 | c0 [label="{0|{}}"]; 9 | c1 [label="{In|{}}"]; 10 | c2 [label="{{|}|Out}"]; 11 | c0:Out0 -> c2:In0 []; 12 | c1:Out0 -> c2:In1 []; 13 | } 14 | 15 | // No components. 16 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-1-0.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_1_0 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="0.75"; 8 | c1 [label="{0|{}}"]; 9 | c2 [label="{In|{}}"]; 10 | c3 [label="{{|}|Out}"]; 11 | c1:Out0 -> c3:In0 []; 12 | c2:Out0 -> c3:In1 []; 13 | } 14 | 15 | // No components. 16 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-bushp1.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_bushp1 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="0.5"; 8 | c1 [label="{0|{}}"]; 9 | c2 [label="{In|{}}"]; 10 | c3 [label="{{|}|Out}"]; 11 | c1:Out0 -> c3:In0 []; 12 | c2:Out0 -> c3:In1 []; 13 | } 14 | 15 | // No components. 16 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-1-1-0.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_1_1_0 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="0.75"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{0|{}}"]; 10 | c3 [label="{In|{|}}"]; 11 | c4 [label="{{||}|Out}"]; 12 | c3:Out0 -> c1:In0 []; 13 | c3:Out1 -> c1:In1 []; 14 | c2:Out0 -> c4:In0 []; 15 | c3:Out0 -> c4:In1 []; 16 | c1:Out0 -> c4:In2 []; 17 | } 18 | 19 | // lsums-1-1-0 components: 1 +, 1 0, 2 total. Max depth: 1. 20 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-bush0.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_bush0 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="0.75"; 8 | c0 [label="{{|}|+|{}}"]; 9 | c1 [label="{0|{}}"]; 10 | c2 [label="{In|{|}}"]; 11 | c3 [label="{{||}|Out}"]; 12 | c2:Out0 -> c0:In0 []; 13 | c2:Out1 -> c0:In1 []; 14 | c1:Out0 -> c3:In0 []; 15 | c2:Out0 -> c3:In1 []; 16 | c0:Out0 -> c3:In2 []; 17 | } 18 | 19 | // lsums-bush0 components: 1 +, 1 0, 2 total. Max depth: 1. 20 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-bushp2.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_bushp2 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="0.75"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{0|{}}"]; 10 | c3 [label="{In|{|}}"]; 11 | c4 [label="{{||}|Out}"]; 12 | c3:Out0 -> c1:In0 []; 13 | c3:Out1 -> c1:In1 []; 14 | c2:Out0 -> c4:In0 []; 15 | c3:Out0 -> c4:In1 []; 16 | c1:Out0 -> c4:In2 []; 17 | } 18 | 19 | // lsums-bushp2 components: 1 +, 1 0, 2 total. Max depth: 1. 20 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-1-0-no-hash-no-opt.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_1_0_no_hash_no_opt { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="0.75"; 8 | c0 [label="{{|}|Out}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c4 [label="{0|{}}"]; 11 | c5 [label="{0|{}}"]; 12 | c8 [label="{In|{}}"]; 13 | c4:Out0 -> c0:In0 []; 14 | c2:Out0 -> c0:In1 []; 15 | c8:Out0 -> c2:In0 []; 16 | c5:Out0 -> c2:In1 []; 17 | } 18 | 19 | // lsums-1-0-no-hash-no-opt components: 1 +, 2 0, 3 total. Max depth: 1. 20 | -------------------------------------------------------------------------------- /examples/stack.yaml: -------------------------------------------------------------------------------- 1 | flags: {} 2 | packages: 3 | - '.' 4 | - /Users/conal/Haskell/shaped-types 5 | - /Users/conal/Haskell/reification-rules 6 | - /Users/conal/Haskell/circat 7 | - location: 8 | git: https://github.com/ku-fpg/hermit 9 | commit: d38052f3ec4cdbcc3ed4df308dae5588354c5be7 10 | extra-dep: true 11 | - location: 12 | git: https://github.com/ku-fpg/netlist 13 | commit: 9869fe5eca7b0478bb352d2f14b2d46a01e46938 14 | subdirs: 15 | - netlist 16 | - verilog 17 | - netlist-to-verilog 18 | extra-dep: true 19 | extra-deps: 20 | - applicative-numbers-0.1.3 21 | - kure-2.16.12 22 | - marked-pretty-1.1.2.1 23 | - newtype-generics-0.4 24 | - ty-0.1.7 25 | resolver: nightly-2016-07-18 26 | -------------------------------------------------------------------------------- /Figures/circuits/point-rb4.dot: -------------------------------------------------------------------------------- 1 | digraph point_rb4 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="6.0"; 8 | c0 [label="{In|{}}"]; 9 | c1 [label="{{|||||||||||||||}|Out}"]; 10 | c0:Out0 -> c1:In0 []; 11 | c0:Out0 -> c1:In1 []; 12 | c0:Out0 -> c1:In2 []; 13 | c0:Out0 -> c1:In3 []; 14 | c0:Out0 -> c1:In4 []; 15 | c0:Out0 -> c1:In5 []; 16 | c0:Out0 -> c1:In6 []; 17 | c0:Out0 -> c1:In7 []; 18 | c0:Out0 -> c1:In8 []; 19 | c0:Out0 -> c1:In9 []; 20 | c0:Out0 -> c1:In10 []; 21 | c0:Out0 -> c1:In11 []; 22 | c0:Out0 -> c1:In12 []; 23 | c0:Out0 -> c1:In13 []; 24 | c0:Out0 -> c1:In14 []; 25 | c0:Out0 -> c1:In15 []; 26 | } 27 | 28 | // No components. 29 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-lv4.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_lv4 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.0"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{0|{}}"]; 12 | c5 [label="{In|{|||}}"]; 13 | c6 [label="{{||||}|Out}"]; 14 | c5:Out0 -> c1:In0 []; 15 | c5:Out1 -> c1:In1 []; 16 | c1:Out0 -> c2:In0 []; 17 | c5:Out2 -> c2:In1 []; 18 | c2:Out0 -> c3:In0 []; 19 | c5:Out3 -> c3:In1 []; 20 | c4:Out0 -> c6:In0 []; 21 | c5:Out0 -> c6:In1 []; 22 | c1:Out0 -> c6:In2 []; 23 | c2:Out0 -> c6:In3 []; 24 | c3:Out0 -> c6:In4 []; 25 | } 26 | 27 | // lsums-lv4 components: 3 +, 1 0, 4 total. Max depth: 3. 28 | -------------------------------------------------------------------------------- /examples/scan-examples.cabal: -------------------------------------------------------------------------------- 1 | name: scan-examples 2 | version: 0.1.0.0 3 | synopsis: Examples for the talk 4 | author: Conal Elliott 5 | maintainer: conal@conal.net 6 | build-type: Simple 7 | extra-source-files: ChangeLog.md 8 | cabal-version: >=1.10 9 | 10 | executable examples 11 | main-is: Examples.hs 12 | build-depends: base >=4.9 && <4.10, keys, pointed 13 | , shaped-types 14 | , circat, reification-rules 15 | default-language: Haskell2010 16 | ghc-options: 17 | -O2 -Wall 18 | -fplugin=ReificationRules.Plugin 19 | -dcore-lint -fexpose-all-unfoldings 20 | 21 | -fsimpl-tick-factor=400 22 | 23 | -- -fplugin-opt=ReificationRules.Plugin:trace 24 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-0-1-1-1-1-l.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_0_1_1_1_1_l { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="0.75"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{0|{}}"]; 12 | c5 [label="{In|{|||}}"]; 13 | c6 [label="{{||||}|Out}"]; 14 | c5:Out0 -> c1:In0 []; 15 | c5:Out1 -> c1:In1 []; 16 | c1:Out0 -> c2:In0 []; 17 | c5:Out2 -> c2:In1 []; 18 | c2:Out0 -> c3:In0 []; 19 | c5:Out3 -> c3:In1 []; 20 | c4:Out0 -> c6:In0 []; 21 | c5:Out0 -> c6:In1 []; 22 | c1:Out0 -> c6:In2 []; 23 | c2:Out0 -> c6:In3 []; 24 | c3:Out0 -> c6:In4 []; 25 | } 26 | 27 | // lsums-0-1-1-1-1-l components: 3 +, 1 0, 4 total. Max depth: 3. 28 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-1-1-0-no-hash-no-opt.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_1_1_0_no_hash_no_opt { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="0.75"; 8 | c0 [label="{{||}|Out}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c4 [label="{{|}|+|{}}"]; 11 | c5 [label="{0|{}}"]; 12 | c6 [label="{{|}|+|{}}"]; 13 | c8 [label="{0|{}}"]; 14 | c9 [label="{0|{}}"]; 15 | c12 [label="{In|{|}}"]; 16 | c5:Out0 -> c0:In0 []; 17 | c4:Out0 -> c0:In1 []; 18 | c2:Out0 -> c0:In2 []; 19 | c12:Out0 -> c2:In0 []; 20 | c6:Out0 -> c2:In1 []; 21 | c12:Out0 -> c4:In0 []; 22 | c8:Out0 -> c4:In1 []; 23 | c12:Out1 -> c6:In0 []; 24 | c9:Out0 -> c6:In1 []; 25 | } 26 | 27 | // lsums-1-1-0-no-hash-no-opt components: 3 +, 3 0, 6 total. Max depth: 2. 28 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | TARG = generic-parallel-scan 2 | 3 | .PRECIOUS: %.tex %.pdf %.web 4 | 5 | all: $(TARG).pdf 6 | 7 | see: $(TARG).see 8 | 9 | dots = $(wildcard Figures/circuits/*.dot) 10 | pdfs = $(addsuffix .pdf, $(basename $(dots))) $(wildcard Figures/circuits/*-scaled.pdf) 11 | 12 | %.pdf: %.tex $(pdfs) Makefile 13 | pdflatex $*.tex 14 | 15 | # --poly is default for lhs2TeX 16 | 17 | %.tex: %.lhs macros.tex mine.fmt Makefile 18 | lhs2TeX -o $*.tex $*.lhs 19 | 20 | showpdf = open -a Skim.app 21 | 22 | %.see: %.pdf 23 | ${showpdf} $*.pdf 24 | 25 | # Cap the size so that LaTeX doesn't choke. 26 | %.pdf: %.dot # Makefile 27 | dot -Tpdf -Gmargin=0 -Gsize=10,10 $< -o $@ 28 | 29 | pdfs: $(pdfs) 30 | 31 | clean: 32 | rm -f $(TARG).{tex,pdf,aux,nav,snm,ptb} 33 | 34 | web: web-token 35 | 36 | STASH=conal@conal.net:/home/conal/web/talks 37 | web: web-token 38 | 39 | web-token: $(TARG).pdf 40 | scp $? $(STASH)/$(TARG).pdf 41 | touch $@ 42 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-bush1.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_bush1 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1"; 8 | c0 [label="{{|}|+|{}}"]; 9 | c1 [label="{{|}|+|{}}"]; 10 | c2 [label="{{|}|+|{}}"]; 11 | c3 [label="{{|}|+|{}}"]; 12 | c4 [label="{0|{}}"]; 13 | c5 [label="{In|{|||}}"]; 14 | c6 [label="{{||||}|Out}"]; 15 | c5:Out0 -> c0:In0 []; 16 | c5:Out1 -> c0:In1 []; 17 | c5:Out2 -> c1:In0 []; 18 | c5:Out3 -> c1:In1 []; 19 | c5:Out2 -> c2:In0 []; 20 | c0:Out0 -> c2:In1 []; 21 | c0:Out0 -> c3:In0 []; 22 | c1:Out0 -> c3:In1 []; 23 | c4:Out0 -> c6:In0 []; 24 | c5:Out0 -> c6:In1 []; 25 | c0:Out0 -> c6:In2 []; 26 | c2:Out0 -> c6:In3 []; 27 | c3:Out0 -> c6:In4 []; 28 | } 29 | 30 | // lsums-bush1 components: 4 +, 1 0, 5 total. Max depth: 2. 31 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-lv5.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_lv5 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{0|{}}"]; 13 | c6 [label="{In|{||||}}"]; 14 | c7 [label="{{|||||}|Out}"]; 15 | c6:Out0 -> c1:In0 []; 16 | c6:Out1 -> c1:In1 []; 17 | c1:Out0 -> c2:In0 []; 18 | c6:Out2 -> c2:In1 []; 19 | c2:Out0 -> c3:In0 []; 20 | c6:Out3 -> c3:In1 []; 21 | c3:Out0 -> c4:In0 []; 22 | c6:Out4 -> c4:In1 []; 23 | c5:Out0 -> c7:In0 []; 24 | c6:Out0 -> c7:In1 []; 25 | c1:Out0 -> c7:In2 []; 26 | c2:Out0 -> c7:In3 []; 27 | c3:Out0 -> c7:In4 []; 28 | c4:Out0 -> c7:In5 []; 29 | } 30 | 31 | // lsums-lv5 components: 4 +, 1 0, 5 total. Max depth: 4. 32 | -------------------------------------------------------------------------------- /examples/readme.md: -------------------------------------------------------------------------------- 1 | [reification-rules]: https://github.com/conal/reification-rules 2 | 3 | ## Examples for scan talk 4 | 5 | I based this project on [reify-core-examples](https://github.com/conal/reify-core-examples). 6 | 7 | Reification and circuit generation happen via the GHC option `-fplugin=ReificationRules.Plugin` in the .cabal file and the `go` function from `ReificationRules.Run` in Examples.hs. 8 | 9 | ## Try it out 10 | 11 | You'll need [graphviz](http://www.graphviz.org/) for rendering the circuit diagrams. For instance, "brew install graphviz" on Mac OS, if you have [homebrew](http://brew.sh/) installed. 12 | 13 | You'll also need GHC 8, so if you don't already have it, do 14 | 15 | stack setup 8.0.1 16 | 17 | With these preliminaries done, build the project and run the examples: 18 | 19 | stack build && stack exec examples 20 | 21 | If several examples are enabled, the `build` step may take a few minutes. If you're on Mac OS (or another OS that supports "open") and if everything is working, you'll see one or more displayed PDFs. The PDF gets saved in out/. 22 | 23 | To enable/disable test examples and add new ones, edit Examples.hs. 24 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-1-1-1-1-0-r.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_1_1_1_1_0_r { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{0|{}}"]; 15 | c8 [label="{In|{|||}}"]; 16 | c9 [label="{{||||}|Out}"]; 17 | c8:Out0 -> c1:In0 []; 18 | c8:Out1 -> c1:In1 []; 19 | c8:Out0 -> c2:In0 []; 20 | c4:Out0 -> c2:In1 []; 21 | c8:Out0 -> c3:In0 []; 22 | c5:Out0 -> c3:In1 []; 23 | c8:Out1 -> c4:In0 []; 24 | c8:Out2 -> c4:In1 []; 25 | c8:Out1 -> c5:In0 []; 26 | c6:Out0 -> c5:In1 []; 27 | c8:Out2 -> c6:In0 []; 28 | c8:Out3 -> c6:In1 []; 29 | c7:Out0 -> c9:In0 []; 30 | c8:Out0 -> c9:In1 []; 31 | c1:Out0 -> c9:In2 []; 32 | c2:Out0 -> c9:In3 []; 33 | c3:Out0 -> c9:In4 []; 34 | } 35 | 36 | // lsums-1-1-1-1-0-r components: 6 +, 1 0, 7 total. Max depth: 3. 37 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-1-1-1-1-l-no-hash-no-opt.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_1_1_1_1_l_no_hash_no_opt { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.0"; 8 | c0 [label="{{||||}|Out}"]; 9 | c1 [label="{{|}|+|{}}"]; 10 | c2 [label="{{|}|+|{}}"]; 11 | c3 [label="{{|}|+|{}}"]; 12 | c4 [label="{{|}|+|{}}"]; 13 | c5 [label="{{|}|+|{}}"]; 14 | c6 [label="{{|}|+|{}}"]; 15 | c7 [label="{0|{}}"]; 16 | c8 [label="{0|{}}"]; 17 | c9 [label="{0|{}}"]; 18 | c10 [label="{0|{}}"]; 19 | c11 [label="{In|{|||}}"]; 20 | c7:Out0 -> c0:In0 []; 21 | c6:Out0 -> c0:In1 []; 22 | c4:Out0 -> c0:In2 []; 23 | c2:Out0 -> c0:In3 []; 24 | c1:Out0 -> c0:In4 []; 25 | c3:Out0 -> c1:In0 []; 26 | c11:Out3 -> c1:In1 []; 27 | c3:Out0 -> c2:In0 []; 28 | c10:Out0 -> c2:In1 []; 29 | c5:Out0 -> c3:In0 []; 30 | c11:Out2 -> c3:In1 []; 31 | c5:Out0 -> c4:In0 []; 32 | c9:Out0 -> c4:In1 []; 33 | c11:Out0 -> c5:In0 []; 34 | c11:Out1 -> c5:In1 []; 35 | c11:Out0 -> c6:In0 []; 36 | c8:Out0 -> c6:In1 []; 37 | } 38 | 39 | // lsums-1-1-1-1-l-no-hash-no-opt components: 6 +, 4 0, 10 total. Max depth: 3. 40 | -------------------------------------------------------------------------------- /Figures/circuits/lsumsp-lv8.dot: -------------------------------------------------------------------------------- 1 | digraph lsumsp_lv8 { 2 | rankdir=LR; 3 | node [shape=Mrecord]; 4 | bgcolor=transparent; 5 | nslimit=20; 6 | ranksep="0.5"; 7 | c1 [label="{{|}|+|{}}"]; 8 | c2 [label="{{|}|+|{}}"]; 9 | c3 [label="{{|}|+|{}}"]; 10 | c4 [label="{{|}|+|{}}"]; 11 | c5 [label="{{|}|+|{}}"]; 12 | c6 [label="{{|}|+|{}}"]; 13 | c7 [label="{{|}|+|{}}"]; 14 | c9 [label="{In|{|||||||}}"]; 15 | c10 [label="{{|||||||}|Out}"]; 16 | c9:Out0 -> c1:In0 []; 17 | c9:Out1 -> c1:In1 []; 18 | c1:Out0 -> c2:In0 []; 19 | c9:Out2 -> c2:In1 []; 20 | c2:Out0 -> c3:In0 []; 21 | c9:Out3 -> c3:In1 []; 22 | c3:Out0 -> c4:In0 []; 23 | c9:Out4 -> c4:In1 []; 24 | c4:Out0 -> c5:In0 []; 25 | c9:Out5 -> c5:In1 []; 26 | c5:Out0 -> c6:In0 []; 27 | c9:Out6 -> c6:In1 []; 28 | c6:Out0 -> c7:In0 []; 29 | c9:Out7 -> c7:In1 []; 30 | c9:Out0 -> c10:In0 []; 31 | c1:Out0 -> c10:In1 []; 32 | c2:Out0 -> c10:In2 []; 33 | c3:Out0 -> c10:In3 []; 34 | c4:Out0 -> c10:In4 []; 35 | c5:Out0 -> c10:In5 []; 36 | c6:Out0 -> c10:In6 []; 37 | c7:Out0 -> c10:In7 []; 38 | } 39 | 40 | // lsumsp-lv8 components: 7 +. Max depth: 7. 41 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-lv8.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_lv8 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="0.675"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{0|{}}"]; 16 | c9 [label="{In|{|||||||}}"]; 17 | c10 [label="{{||||||||}|Out}"]; 18 | c9:Out0 -> c1:In0 []; 19 | c9:Out1 -> c1:In1 []; 20 | c1:Out0 -> c2:In0 []; 21 | c9:Out2 -> c2:In1 []; 22 | c2:Out0 -> c3:In0 []; 23 | c9:Out3 -> c3:In1 []; 24 | c3:Out0 -> c4:In0 []; 25 | c9:Out4 -> c4:In1 []; 26 | c4:Out0 -> c5:In0 []; 27 | c9:Out5 -> c5:In1 []; 28 | c5:Out0 -> c6:In0 []; 29 | c9:Out6 -> c6:In1 []; 30 | c6:Out0 -> c7:In0 []; 31 | c9:Out7 -> c7:In1 []; 32 | c8:Out0 -> c10:In0 []; 33 | c9:Out0 -> c10:In1 []; 34 | c1:Out0 -> c10:In2 []; 35 | c2:Out0 -> c10:In3 []; 36 | c3:Out0 -> c10:In4 []; 37 | c4:Out0 -> c10:In5 []; 38 | c5:Out0 -> c10:In6 []; 39 | c6:Out0 -> c10:In7 []; 40 | c7:Out0 -> c10:In8 []; 41 | } 42 | 43 | // lsums-lv8 components: 7 +, 1 0, 8 total. Max depth: 7. 44 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-lv8-wide.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_lv8_wide { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.25"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{0|{}}"]; 16 | c9 [label="{In|{|||||||}}"]; 17 | c10 [label="{{||||||||}|Out}"]; 18 | c9:Out0 -> c1:In0 []; 19 | c9:Out1 -> c1:In1 []; 20 | c1:Out0 -> c2:In0 []; 21 | c9:Out2 -> c2:In1 []; 22 | c2:Out0 -> c3:In0 []; 23 | c9:Out3 -> c3:In1 []; 24 | c3:Out0 -> c4:In0 []; 25 | c9:Out4 -> c4:In1 []; 26 | c4:Out0 -> c5:In0 []; 27 | c9:Out5 -> c5:In1 []; 28 | c5:Out0 -> c6:In0 []; 29 | c9:Out6 -> c6:In1 []; 30 | c6:Out0 -> c7:In0 []; 31 | c9:Out7 -> c7:In1 []; 32 | c8:Out0 -> c10:In0 []; 33 | c9:Out0 -> c10:In1 []; 34 | c1:Out0 -> c10:In2 []; 35 | c2:Out0 -> c10:In3 []; 36 | c3:Out0 -> c10:In4 []; 37 | c4:Out0 -> c10:In5 []; 38 | c5:Out0 -> c10:In6 []; 39 | c6:Out0 -> c10:In7 []; 40 | c7:Out0 -> c10:In8 []; 41 | } 42 | 43 | // lsums-lv8-wide components: 7 +, 1 0, 8 total. Max depth: 7. 44 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-0-1-1-1-1-l-no-hash-no-opt.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_0_1_1_1_1_l_no_hash_no_opt { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.0"; 8 | c0 [label="{{||||}|Out}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}"]; 17 | c10 [label="{0|{}}"]; 18 | c12 [label="{0|{}}"]; 19 | c13 [label="{0|{}}"]; 20 | c14 [label="{0|{}}"]; 21 | c15 [label="{0|{}}"]; 22 | c17 [label="{In|{|||}}"]; 23 | c9:Out0 -> c0:In0 []; 24 | c7:Out0 -> c0:In1 []; 25 | c5:Out0 -> c0:In2 []; 26 | c3:Out0 -> c0:In3 []; 27 | c2:Out0 -> c0:In4 []; 28 | c4:Out0 -> c2:In0 []; 29 | c17:Out3 -> c2:In1 []; 30 | c4:Out0 -> c3:In0 []; 31 | c15:Out0 -> c3:In1 []; 32 | c6:Out0 -> c4:In0 []; 33 | c17:Out2 -> c4:In1 []; 34 | c6:Out0 -> c5:In0 []; 35 | c14:Out0 -> c5:In1 []; 36 | c8:Out0 -> c6:In0 []; 37 | c17:Out1 -> c6:In1 []; 38 | c8:Out0 -> c7:In0 []; 39 | c13:Out0 -> c7:In1 []; 40 | c10:Out0 -> c8:In0 []; 41 | c17:Out0 -> c8:In1 []; 42 | c10:Out0 -> c9:In0 []; 43 | c12:Out0 -> c9:In1 []; 44 | } 45 | 46 | // lsums-0-1-1-1-1-l-no-hash-no-opt components: 8 +, 5 0, 13 total. Max depth: 4. 47 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-1-1-1-1-r-no-hash-no-opt.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_1_1_1_1_r_no_hash_no_opt { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.0"; 8 | c0 [label="{{||||}|Out}"]; 9 | c1 [label="{{|}|+|{}}"]; 10 | c2 [label="{{|}|+|{}}"]; 11 | c3 [label="{{|}|+|{}}"]; 12 | c4 [label="{{|}|+|{}}"]; 13 | c5 [label="{0|{}}"]; 14 | c6 [label="{{|}|+|{}}"]; 15 | c7 [label="{{|}|+|{}}"]; 16 | c8 [label="{{|}|+|{}}"]; 17 | c9 [label="{0|{}}"]; 18 | c10 [label="{{|}|+|{}}"]; 19 | c11 [label="{{|}|+|{}}"]; 20 | c12 [label="{0|{}}"]; 21 | c13 [label="{0|{}}"]; 22 | c14 [label="{In|{|||}}"]; 23 | c5:Out0 -> c0:In0 []; 24 | c4:Out0 -> c0:In1 []; 25 | c3:Out0 -> c0:In2 []; 26 | c2:Out0 -> c0:In3 []; 27 | c1:Out0 -> c0:In4 []; 28 | c14:Out0 -> c1:In0 []; 29 | c6:Out0 -> c1:In1 []; 30 | c14:Out0 -> c2:In0 []; 31 | c7:Out0 -> c2:In1 []; 32 | c14:Out0 -> c3:In0 []; 33 | c8:Out0 -> c3:In1 []; 34 | c14:Out0 -> c4:In0 []; 35 | c9:Out0 -> c4:In1 []; 36 | c14:Out1 -> c6:In0 []; 37 | c10:Out0 -> c6:In1 []; 38 | c14:Out1 -> c7:In0 []; 39 | c11:Out0 -> c7:In1 []; 40 | c14:Out1 -> c8:In0 []; 41 | c12:Out0 -> c8:In1 []; 42 | c14:Out2 -> c10:In0 []; 43 | c14:Out3 -> c10:In1 []; 44 | c14:Out2 -> c11:In0 []; 45 | c13:Out0 -> c11:In1 []; 46 | } 47 | 48 | // lsums-1-1-1-1-r-no-hash-no-opt components: 9 +, 4 0, 13 total. Max depth: 3. 49 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-1-1-1-1-0-r-no-hash-no-opt.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_1_1_1_1_0_r_no_hash_no_opt { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.4"; 8 | c0 [label="{{||||}|Out}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c4 [label="{{|}|+|{}}"]; 11 | c5 [label="{{|}|+|{}}"]; 12 | c6 [label="{{|}|+|{}}"]; 13 | c7 [label="{0|{}}"]; 14 | c8 [label="{{|}|+|{}}"]; 15 | c10 [label="{{|}|+|{}}"]; 16 | c11 [label="{{|}|+|{}}"]; 17 | c12 [label="{0|{}}"]; 18 | c13 [label="{{|}|+|{}}"]; 19 | c15 [label="{{|}|+|{}}"]; 20 | c16 [label="{0|{}}"]; 21 | c17 [label="{{|}|+|{}}"]; 22 | c19 [label="{0|{}}"]; 23 | c20 [label="{0|{}}"]; 24 | c23 [label="{In|{|||}}"]; 25 | c7:Out0 -> c0:In0 []; 26 | c6:Out0 -> c0:In1 []; 27 | c5:Out0 -> c0:In2 []; 28 | c4:Out0 -> c0:In3 []; 29 | c2:Out0 -> c0:In4 []; 30 | c23:Out0 -> c2:In0 []; 31 | c8:Out0 -> c2:In1 []; 32 | c23:Out0 -> c4:In0 []; 33 | c10:Out0 -> c4:In1 []; 34 | c23:Out0 -> c5:In0 []; 35 | c11:Out0 -> c5:In1 []; 36 | c23:Out0 -> c6:In0 []; 37 | c12:Out0 -> c6:In1 []; 38 | c23:Out1 -> c8:In0 []; 39 | c13:Out0 -> c8:In1 []; 40 | c23:Out1 -> c10:In0 []; 41 | c15:Out0 -> c10:In1 []; 42 | c23:Out1 -> c11:In0 []; 43 | c16:Out0 -> c11:In1 []; 44 | c23:Out2 -> c13:In0 []; 45 | c17:Out0 -> c13:In1 []; 46 | c23:Out2 -> c15:In0 []; 47 | c19:Out0 -> c15:In1 []; 48 | c23:Out3 -> c17:In0 []; 49 | c20:Out0 -> c17:In1 []; 50 | } 51 | 52 | // lsums-1-1-1-1-0-r-no-hash-no-opt components: 10 +, 5 0, 15 total. Max depth: 4. 53 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-lv11.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_lv11 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}"]; 17 | c10 [label="{{|}|+|{}}"]; 18 | c11 [label="{0|{}}"]; 19 | c12 [label="{In|{||||||||||}}"]; 20 | c13 [label="{{|||||||||||}|Out}"]; 21 | c12:Out0 -> c1:In0 []; 22 | c12:Out1 -> c1:In1 []; 23 | c1:Out0 -> c2:In0 []; 24 | c12:Out2 -> c2:In1 []; 25 | c2:Out0 -> c3:In0 []; 26 | c12:Out3 -> c3:In1 []; 27 | c3:Out0 -> c4:In0 []; 28 | c12:Out4 -> c4:In1 []; 29 | c4:Out0 -> c5:In0 []; 30 | c12:Out5 -> c5:In1 []; 31 | c5:Out0 -> c6:In0 []; 32 | c12:Out6 -> c6:In1 []; 33 | c6:Out0 -> c7:In0 []; 34 | c12:Out7 -> c7:In1 []; 35 | c7:Out0 -> c8:In0 []; 36 | c12:Out8 -> c8:In1 []; 37 | c8:Out0 -> c9:In0 []; 38 | c12:Out9 -> c9:In1 []; 39 | c9:Out0 -> c10:In0 []; 40 | c12:Out10 -> c10:In1 []; 41 | c11:Out0 -> c13:In0 []; 42 | c12:Out0 -> c13:In1 []; 43 | c1:Out0 -> c13:In2 []; 44 | c2:Out0 -> c13:In3 []; 45 | c3:Out0 -> c13:In4 []; 46 | c4:Out0 -> c13:In5 []; 47 | c5:Out0 -> c13:In6 []; 48 | c6:Out0 -> c13:In7 []; 49 | c7:Out0 -> c13:In8 []; 50 | c8:Out0 -> c13:In9 []; 51 | c9:Out0 -> c13:In10 []; 52 | c10:Out0 -> c13:In11 []; 53 | } 54 | 55 | // lsums-lv11 components: 10 +, 1 0, 11 total. Max depth: 10. 56 | -------------------------------------------------------------------------------- /Figures/circuits/lsumsp-lv8-and-lv8.dot: -------------------------------------------------------------------------------- 1 | digraph lsumsp_lv8_and_lv8 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.0"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}"]; 17 | c10 [label="{{|}|+|{}}"]; 18 | c11 [label="{{|}|+|{}}"]; 19 | c12 [label="{{|}|+|{}}"]; 20 | c13 [label="{{|}|+|{}}"]; 21 | c14 [label="{{|}|+|{}}"]; 22 | c16 [label="{In|{|||||||||||||||}}"]; 23 | c17 [label="{{|||||||||||||||}|Out}"]; 24 | c16:Out0 -> c1:In0 []; 25 | c16:Out1 -> c1:In1 []; 26 | c16:Out8 -> c2:In0 []; 27 | c16:Out9 -> c2:In1 []; 28 | c1:Out0 -> c3:In0 []; 29 | c16:Out2 -> c3:In1 []; 30 | c3:Out0 -> c4:In0 []; 31 | c16:Out3 -> c4:In1 []; 32 | c4:Out0 -> c5:In0 []; 33 | c16:Out4 -> c5:In1 []; 34 | c5:Out0 -> c6:In0 []; 35 | c16:Out5 -> c6:In1 []; 36 | c6:Out0 -> c7:In0 []; 37 | c16:Out6 -> c7:In1 []; 38 | c7:Out0 -> c8:In0 []; 39 | c16:Out7 -> c8:In1 []; 40 | c2:Out0 -> c9:In0 []; 41 | c16:Out10 -> c9:In1 []; 42 | c9:Out0 -> c10:In0 []; 43 | c16:Out11 -> c10:In1 []; 44 | c10:Out0 -> c11:In0 []; 45 | c16:Out12 -> c11:In1 []; 46 | c11:Out0 -> c12:In0 []; 47 | c16:Out13 -> c12:In1 []; 48 | c12:Out0 -> c13:In0 []; 49 | c16:Out14 -> c13:In1 []; 50 | c13:Out0 -> c14:In0 []; 51 | c16:Out15 -> c14:In1 []; 52 | c16:Out0 -> c17:In0 []; 53 | c1:Out0 -> c17:In1 []; 54 | c3:Out0 -> c17:In2 []; 55 | c4:Out0 -> c17:In3 []; 56 | c5:Out0 -> c17:In4 []; 57 | c6:Out0 -> c17:In5 []; 58 | c7:Out0 -> c17:In6 []; 59 | c8:Out0 -> c17:In7 []; 60 | c16:Out8 -> c17:In8 []; 61 | c2:Out0 -> c17:In9 []; 62 | c9:Out0 -> c17:In10 []; 63 | c10:Out0 -> c17:In11 []; 64 | c11:Out0 -> c17:In12 []; 65 | c12:Out0 -> c17:In13 []; 66 | c13:Out0 -> c17:In14 []; 67 | c14:Out0 -> c17:In15 []; 68 | } 69 | 70 | // lsumsp-lv8-and-lv8 components: 14 +. Max depth: 7. 71 | -------------------------------------------------------------------------------- /Figures/circuits/powers-rb4.dot: -------------------------------------------------------------------------------- 1 | digraph powers_rb4 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="2.45"; 8 | c0 [label="{1|{}}"]; 9 | c1 [label="{In|{}}"]; 10 | c2 [label="{{||||||||||||||||}|Out}"]; 11 | c3 [label="{{|}|\×|{}}"]; 12 | c4 [label="{{|}|\×|{}}"]; 13 | c5 [label="{{|}|\×|{}}"]; 14 | c6 [label="{{|}|\×|{}}"]; 15 | c7 [label="{{|}|\×|{}}"]; 16 | c8 [label="{{|}|\×|{}}"]; 17 | c9 [label="{{|}|\×|{}}"]; 18 | c10 [label="{{|}|\×|{}}"]; 19 | c11 [label="{{|}|\×|{}}"]; 20 | c12 [label="{{|}|\×|{}}"]; 21 | c13 [label="{{|}|\×|{}}"]; 22 | c14 [label="{{|}|\×|{}}"]; 23 | c15 [label="{{|}|\×|{}}"]; 24 | c16 [label="{{|}|\×|{}}"]; 25 | c17 [label="{{|}|\×|{}}"]; 26 | c0:Out0 -> c2:In0 []; 27 | c1:Out0 -> c2:In1 []; 28 | c3:Out0 -> c2:In2 []; 29 | c4:Out0 -> c2:In3 []; 30 | c5:Out0 -> c2:In4 []; 31 | c6:Out0 -> c2:In5 []; 32 | c7:Out0 -> c2:In6 []; 33 | c9:Out0 -> c2:In7 []; 34 | c8:Out0 -> c2:In8 []; 35 | c10:Out0 -> c2:In9 []; 36 | c11:Out0 -> c2:In10 []; 37 | c13:Out0 -> c2:In11 []; 38 | c12:Out0 -> c2:In12 []; 39 | c15:Out0 -> c2:In13 []; 40 | c16:Out0 -> c2:In14 []; 41 | c17:Out0 -> c2:In15 []; 42 | c14:Out0 -> c2:In16 []; 43 | c1:Out0 -> c3:In0 []; 44 | c1:Out0 -> c3:In1 []; 45 | c3:Out0 -> c4:In0 []; 46 | c1:Out0 -> c4:In1 []; 47 | c3:Out0 -> c5:In0 []; 48 | c3:Out0 -> c5:In1 []; 49 | c5:Out0 -> c6:In0 []; 50 | c1:Out0 -> c6:In1 []; 51 | c5:Out0 -> c7:In0 []; 52 | c3:Out0 -> c7:In1 []; 53 | c5:Out0 -> c8:In0 []; 54 | c5:Out0 -> c8:In1 []; 55 | c5:Out0 -> c9:In0 []; 56 | c4:Out0 -> c9:In1 []; 57 | c8:Out0 -> c10:In0 []; 58 | c1:Out0 -> c10:In1 []; 59 | c8:Out0 -> c11:In0 []; 60 | c3:Out0 -> c11:In1 []; 61 | c8:Out0 -> c12:In0 []; 62 | c5:Out0 -> c12:In1 []; 63 | c8:Out0 -> c13:In0 []; 64 | c4:Out0 -> c13:In1 []; 65 | c8:Out0 -> c14:In0 []; 66 | c8:Out0 -> c14:In1 []; 67 | c8:Out0 -> c15:In0 []; 68 | c6:Out0 -> c15:In1 []; 69 | c8:Out0 -> c16:In0 []; 70 | c7:Out0 -> c16:In1 []; 71 | c8:Out0 -> c17:In0 []; 72 | c9:Out0 -> c17:In1 []; 73 | } 74 | 75 | // powers-rb4 components: 1 1, 15 ×, 16 total. Max depth: 4. 76 | -------------------------------------------------------------------------------- /Figures/circuits/lsumsp-lv16.dot: -------------------------------------------------------------------------------- 1 | digraph lsumsp_lv16 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="0.5"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}"]; 17 | c10 [label="{{|}|+|{}}"]; 18 | c11 [label="{{|}|+|{}}"]; 19 | c12 [label="{{|}|+|{}}"]; 20 | c13 [label="{{|}|+|{}}"]; 21 | c14 [label="{{|}|+|{}}"]; 22 | c15 [label="{{|}|+|{}}"]; 23 | c17 [label="{In|{|||||||||||||||}}"]; 24 | c18 [label="{{|||||||||||||||}|Out}"]; 25 | c17:Out0 -> c1:In0 []; 26 | c17:Out1 -> c1:In1 []; 27 | c1:Out0 -> c2:In0 []; 28 | c17:Out2 -> c2:In1 []; 29 | c2:Out0 -> c3:In0 []; 30 | c17:Out3 -> c3:In1 []; 31 | c3:Out0 -> c4:In0 []; 32 | c17:Out4 -> c4:In1 []; 33 | c4:Out0 -> c5:In0 []; 34 | c17:Out5 -> c5:In1 []; 35 | c5:Out0 -> c6:In0 []; 36 | c17:Out6 -> c6:In1 []; 37 | c6:Out0 -> c7:In0 []; 38 | c17:Out7 -> c7:In1 []; 39 | c7:Out0 -> c8:In0 []; 40 | c17:Out8 -> c8:In1 []; 41 | c8:Out0 -> c9:In0 []; 42 | c17:Out9 -> c9:In1 []; 43 | c9:Out0 -> c10:In0 []; 44 | c17:Out10 -> c10:In1 []; 45 | c10:Out0 -> c11:In0 []; 46 | c17:Out11 -> c11:In1 []; 47 | c11:Out0 -> c12:In0 []; 48 | c17:Out12 -> c12:In1 []; 49 | c12:Out0 -> c13:In0 []; 50 | c17:Out13 -> c13:In1 []; 51 | c13:Out0 -> c14:In0 []; 52 | c17:Out14 -> c14:In1 []; 53 | c14:Out0 -> c15:In0 []; 54 | c17:Out15 -> c15:In1 []; 55 | c17:Out0 -> c18:In0 []; 56 | c1:Out0 -> c18:In1 []; 57 | c2:Out0 -> c18:In2 []; 58 | c3:Out0 -> c18:In3 []; 59 | c4:Out0 -> c18:In4 []; 60 | c5:Out0 -> c18:In5 []; 61 | c6:Out0 -> c18:In6 []; 62 | c7:Out0 -> c18:In7 []; 63 | c8:Out0 -> c18:In8 []; 64 | c9:Out0 -> c18:In9 []; 65 | c10:Out0 -> c18:In10 []; 66 | c11:Out0 -> c18:In11 []; 67 | c12:Out0 -> c18:In12 []; 68 | c13:Out0 -> c18:In13 []; 69 | c14:Out0 -> c18:In14 []; 70 | c15:Out0 -> c18:In15 []; 71 | } 72 | 73 | // lsumsp-lv16 components: 15 +. Max depth: 15. 74 | -------------------------------------------------------------------------------- /todo.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: *To do* items for revised *Generic parallel scan* 3 | subst: ["&&& △","*** ×","||| ▽","+++ +","|- ⊢","<~ ⤺","k (↝)","op (⊙)","--> ⇨","+-> ➔",":*: ✖",":+: ➕",":->? ⤔","Unit ()","R ℝ","Unit 𝟙",":==> ⤇"] 4 | --- 5 | 6 | ## To do 7 | 8 | * Relation to known parallel scan algorithms. 9 | I think Sklansky did top-down and Ladner & Fischer did bottom-up. 10 | * Scan complexity for `Bush`. 11 | * Statistics summary 12 | * Complexity --- Master Theorem 13 | * Future work: 14 | * Finish complexity analysis (bushes) 15 | * Derive each instance from the `Traversable`-based specification. 16 | * `Monoid` vs `Semigroup`, e.g., `Max` with `RPow`, `LPow`, `Bush`, and non-empty left- and right-vectors. 17 | 18 | 19 | ## Or not 20 | 21 | * Consider a picture with 2D layout for parallel scan, akin to FFT. 22 | * Horizontal arrows to show the scan paths. 23 | * Add a result column for the sub-totals. 24 | The extra scan is vertical. 25 | * Maybe also a picture for the linear sequential algorithm, showing dependency chains. 26 | * Do the circuit pictures give this information? 27 | If not, could they? 28 | * Wide vs tall. 29 | * Maybe my circuit diagrams would work fine. 30 | * A type closer to the original bush type. 31 | * Consider making `adjustl`/`bump` be a function from `And1`. 32 | Would the change simplify `LScan (g :.: f)`? 33 | I don't think so. 34 | 35 | 36 | ## Done 37 | 38 | * Conclusions 39 | * Some applications: 40 | * Polynomial evaluation 41 | * Parallel multi-bit adders 42 | * Larger tree examples 43 | * Move supporting code to a new Stack project under this directory. 44 | * Update abstract in [the README](README.md) and [meetup announcement](https://www.meetup.com/haskellhackers/events/234242974/). 45 | * Minimal CUDA comparison 46 | * Generics / tinker toys. 47 | Show at least some of the `LScan` instances, including product and (especially) composition. 48 | * Use `LPow` and `RPow` from *Generic FFT*. 49 | * `LVec` and `RVec`. 50 | * `Bush` 51 | * Maybe at first do simple inclusive scan for the pictures. 52 | We'll see later why use exclusive+fold. 53 | * Do functor product before composition: 54 | * Show `Pair :.: LVec N8` and `LVec N8 :.: Pair`. 55 | Already defined and rendered in `reify-core-examples`. 56 | * `lproducts` with `LBin`, `RBin`, and `Bush`. 57 | * Change `LScan` to use `c a -> (c :*: Id) a`. 58 | * Oh. I've already done it in `ShapedTypes.ScanF`. 59 | * Maybe use an infix operator in place of `And1`. 60 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-lv3olv4-unknown-no-hash.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_lv3olv4_unknown_no_hash { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.75"; 8 | c0 [label="{{||||||||||||}|Out}"]; 9 | c1 [label="{{||||||||||||||}|??|{||||||||||||}}",fontcolor=red,color=red,style=bold]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{0|{}}"]; 14 | c15 [label="{{|}|+|{}}"]; 15 | c16 [label="{{|}|+|{}}"]; 16 | c17 [label="{{|}|+|{}}"]; 17 | c18 [label="{0|{}}"]; 18 | c27 [label="{{|}|+|{}}"]; 19 | c28 [label="{{|}|+|{}}"]; 20 | c29 [label="{{|}|+|{}}"]; 21 | c30 [label="{0|{}}"]; 22 | c39 [label="{In|{|||||||||||}}"]; 23 | c1:Out0 -> c0:In0 []; 24 | c1:Out1 -> c0:In1 []; 25 | c1:Out2 -> c0:In2 []; 26 | c1:Out3 -> c0:In3 []; 27 | c1:Out4 -> c0:In4 []; 28 | c1:Out5 -> c0:In5 []; 29 | c1:Out6 -> c0:In6 []; 30 | c1:Out7 -> c0:In7 []; 31 | c1:Out8 -> c0:In8 []; 32 | c1:Out9 -> c0:In9 []; 33 | c1:Out10 -> c0:In10 []; 34 | c1:Out11 -> c0:In11 []; 35 | c1:Out12 -> c0:In12 []; 36 | c30:Out0 -> c1:In0 []; 37 | c39:Out0 -> c1:In1 []; 38 | c29:Out0 -> c1:In2 []; 39 | c28:Out0 -> c1:In3 []; 40 | c27:Out0 -> c1:In4 []; 41 | c18:Out0 -> c1:In5 []; 42 | c39:Out4 -> c1:In6 []; 43 | c17:Out0 -> c1:In7 []; 44 | c16:Out0 -> c1:In8 []; 45 | c15:Out0 -> c1:In9 []; 46 | c6:Out0 -> c1:In10 []; 47 | c39:Out8 -> c1:In11 []; 48 | c5:Out0 -> c1:In12 []; 49 | c4:Out0 -> c1:In13 []; 50 | c3:Out0 -> c1:In14 []; 51 | c4:Out0 -> c3:In0 []; 52 | c39:Out11 -> c3:In1 []; 53 | c5:Out0 -> c4:In0 []; 54 | c39:Out10 -> c4:In1 []; 55 | c39:Out8 -> c5:In0 []; 56 | c39:Out9 -> c5:In1 []; 57 | c16:Out0 -> c15:In0 []; 58 | c39:Out7 -> c15:In1 []; 59 | c17:Out0 -> c16:In0 []; 60 | c39:Out6 -> c16:In1 []; 61 | c39:Out4 -> c17:In0 []; 62 | c39:Out5 -> c17:In1 []; 63 | c28:Out0 -> c27:In0 []; 64 | c39:Out3 -> c27:In1 []; 65 | c29:Out0 -> c28:In0 []; 66 | c39:Out2 -> c28:In1 []; 67 | c39:Out0 -> c29:In0 []; 68 | c39:Out1 -> c29:In1 []; 69 | } 70 | 71 | // lsums-lv3olv4-unknown-no-hash components: 9 +, 3 0, 1 ??, 13 total. Max depth: 4. 72 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-lv16.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_lv16 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="0.5"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}"]; 17 | c10 [label="{{|}|+|{}}"]; 18 | c11 [label="{{|}|+|{}}"]; 19 | c12 [label="{{|}|+|{}}"]; 20 | c13 [label="{{|}|+|{}}"]; 21 | c14 [label="{{|}|+|{}}"]; 22 | c15 [label="{{|}|+|{}}"]; 23 | c16 [label="{0|{}}"]; 24 | c17 [label="{In|{|||||||||||||||}}"]; 25 | c18 [label="{{||||||||||||||||}|Out}"]; 26 | c17:Out0 -> c1:In0 []; 27 | c17:Out1 -> c1:In1 []; 28 | c1:Out0 -> c2:In0 []; 29 | c17:Out2 -> c2:In1 []; 30 | c2:Out0 -> c3:In0 []; 31 | c17:Out3 -> c3:In1 []; 32 | c3:Out0 -> c4:In0 []; 33 | c17:Out4 -> c4:In1 []; 34 | c4:Out0 -> c5:In0 []; 35 | c17:Out5 -> c5:In1 []; 36 | c5:Out0 -> c6:In0 []; 37 | c17:Out6 -> c6:In1 []; 38 | c6:Out0 -> c7:In0 []; 39 | c17:Out7 -> c7:In1 []; 40 | c7:Out0 -> c8:In0 []; 41 | c17:Out8 -> c8:In1 []; 42 | c8:Out0 -> c9:In0 []; 43 | c17:Out9 -> c9:In1 []; 44 | c9:Out0 -> c10:In0 []; 45 | c17:Out10 -> c10:In1 []; 46 | c10:Out0 -> c11:In0 []; 47 | c17:Out11 -> c11:In1 []; 48 | c11:Out0 -> c12:In0 []; 49 | c17:Out12 -> c12:In1 []; 50 | c12:Out0 -> c13:In0 []; 51 | c17:Out13 -> c13:In1 []; 52 | c13:Out0 -> c14:In0 []; 53 | c17:Out14 -> c14:In1 []; 54 | c14:Out0 -> c15:In0 []; 55 | c17:Out15 -> c15:In1 []; 56 | c16:Out0 -> c18:In0 []; 57 | c17:Out0 -> c18:In1 []; 58 | c1:Out0 -> c18:In2 []; 59 | c2:Out0 -> c18:In3 []; 60 | c3:Out0 -> c18:In4 []; 61 | c4:Out0 -> c18:In5 []; 62 | c5:Out0 -> c18:In6 []; 63 | c6:Out0 -> c18:In7 []; 64 | c7:Out0 -> c18:In8 []; 65 | c8:Out0 -> c18:In9 []; 66 | c9:Out0 -> c18:In10 []; 67 | c10:Out0 -> c18:In11 []; 68 | c11:Out0 -> c18:In12 []; 69 | c12:Out0 -> c18:In13 []; 70 | c13:Out0 -> c18:In14 []; 71 | c14:Out0 -> c18:In15 []; 72 | c15:Out0 -> c18:In16 []; 73 | } 74 | 75 | // lsums-lv16 components: 15 +, 1 0, 16 total. Max depth: 15. 76 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-lv3olv4.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_lv3olv4 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.2"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}"]; 17 | c10 [label="{{|}|+|{}}"]; 18 | c11 [label="{{|}|+|{}}"]; 19 | c12 [label="{{|}|+|{}}"]; 20 | c13 [label="{{|}|+|{}}"]; 21 | c14 [label="{{|}|+|{}}"]; 22 | c15 [label="{{|}|+|{}}"]; 23 | c16 [label="{{|}|+|{}}"]; 24 | c17 [label="{{|}|+|{}}"]; 25 | c18 [label="{0|{}}"]; 26 | c19 [label="{In|{|||||||||||}}"]; 27 | c20 [label="{{||||||||||||}|Out}"]; 28 | c19:Out0 -> c1:In0 []; 29 | c19:Out1 -> c1:In1 []; 30 | c19:Out4 -> c2:In0 []; 31 | c19:Out5 -> c2:In1 []; 32 | c19:Out8 -> c3:In0 []; 33 | c19:Out9 -> c3:In1 []; 34 | c1:Out0 -> c4:In0 []; 35 | c19:Out2 -> c4:In1 []; 36 | c4:Out0 -> c5:In0 []; 37 | c19:Out3 -> c5:In1 []; 38 | c5:Out0 -> c6:In0 []; 39 | c19:Out4 -> c6:In1 []; 40 | c5:Out0 -> c7:In0 []; 41 | c2:Out0 -> c7:In1 []; 42 | c5:Out0 -> c8:In0 []; 43 | c10:Out0 -> c8:In1 []; 44 | c5:Out0 -> c9:In0 []; 45 | c11:Out0 -> c9:In1 []; 46 | c2:Out0 -> c10:In0 []; 47 | c19:Out6 -> c10:In1 []; 48 | c10:Out0 -> c11:In0 []; 49 | c19:Out7 -> c11:In1 []; 50 | c3:Out0 -> c12:In0 []; 51 | c19:Out10 -> c12:In1 []; 52 | c12:Out0 -> c13:In0 []; 53 | c19:Out11 -> c13:In1 []; 54 | c9:Out0 -> c14:In0 []; 55 | c19:Out8 -> c14:In1 []; 56 | c9:Out0 -> c15:In0 []; 57 | c3:Out0 -> c15:In1 []; 58 | c9:Out0 -> c16:In0 []; 59 | c12:Out0 -> c16:In1 []; 60 | c9:Out0 -> c17:In0 []; 61 | c13:Out0 -> c17:In1 []; 62 | c18:Out0 -> c20:In0 []; 63 | c19:Out0 -> c20:In1 []; 64 | c1:Out0 -> c20:In2 []; 65 | c4:Out0 -> c20:In3 []; 66 | c5:Out0 -> c20:In4 []; 67 | c6:Out0 -> c20:In5 []; 68 | c7:Out0 -> c20:In6 []; 69 | c8:Out0 -> c20:In7 []; 70 | c9:Out0 -> c20:In8 []; 71 | c14:Out0 -> c20:In9 []; 72 | c15:Out0 -> c20:In10 []; 73 | c16:Out0 -> c20:In11 []; 74 | c17:Out0 -> c20:In12 []; 75 | } 76 | 77 | // lsums-lv3olv4 components: 17 +, 1 0, 18 total. Max depth: 5. 78 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-lv8-no-hash-no-opt.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_lv8_no_hash_no_opt { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="0.75"; 8 | c0 [label="{{||||||||}|Out}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}"]; 17 | c10 [label="{{|}|+|{}}"]; 18 | c11 [label="{{|}|+|{}}"]; 19 | c12 [label="{{|}|+|{}}"]; 20 | c13 [label="{{|}|+|{}}"]; 21 | c14 [label="{{|}|+|{}}"]; 22 | c15 [label="{{|}|+|{}}"]; 23 | c16 [label="{{|}|+|{}}"]; 24 | c17 [label="{{|}|+|{}}"]; 25 | c18 [label="{0|{}}"]; 26 | c20 [label="{0|{}}"]; 27 | c21 [label="{0|{}}"]; 28 | c22 [label="{0|{}}"]; 29 | c23 [label="{0|{}}"]; 30 | c24 [label="{0|{}}"]; 31 | c25 [label="{0|{}}"]; 32 | c26 [label="{0|{}}"]; 33 | c27 [label="{0|{}}"]; 34 | c29 [label="{In|{|||||||}}"]; 35 | c17:Out0 -> c0:In0 []; 36 | c15:Out0 -> c0:In1 []; 37 | c13:Out0 -> c0:In2 []; 38 | c11:Out0 -> c0:In3 []; 39 | c9:Out0 -> c0:In4 []; 40 | c7:Out0 -> c0:In5 []; 41 | c5:Out0 -> c0:In6 []; 42 | c3:Out0 -> c0:In7 []; 43 | c2:Out0 -> c0:In8 []; 44 | c4:Out0 -> c2:In0 []; 45 | c29:Out7 -> c2:In1 []; 46 | c4:Out0 -> c3:In0 []; 47 | c27:Out0 -> c3:In1 []; 48 | c6:Out0 -> c4:In0 []; 49 | c29:Out6 -> c4:In1 []; 50 | c6:Out0 -> c5:In0 []; 51 | c26:Out0 -> c5:In1 []; 52 | c8:Out0 -> c6:In0 []; 53 | c29:Out5 -> c6:In1 []; 54 | c8:Out0 -> c7:In0 []; 55 | c25:Out0 -> c7:In1 []; 56 | c10:Out0 -> c8:In0 []; 57 | c29:Out4 -> c8:In1 []; 58 | c10:Out0 -> c9:In0 []; 59 | c24:Out0 -> c9:In1 []; 60 | c12:Out0 -> c10:In0 []; 61 | c29:Out3 -> c10:In1 []; 62 | c12:Out0 -> c11:In0 []; 63 | c23:Out0 -> c11:In1 []; 64 | c14:Out0 -> c12:In0 []; 65 | c29:Out2 -> c12:In1 []; 66 | c14:Out0 -> c13:In0 []; 67 | c22:Out0 -> c13:In1 []; 68 | c16:Out0 -> c14:In0 []; 69 | c29:Out1 -> c14:In1 []; 70 | c16:Out0 -> c15:In0 []; 71 | c21:Out0 -> c15:In1 []; 72 | c18:Out0 -> c16:In0 []; 73 | c29:Out0 -> c16:In1 []; 74 | c18:Out0 -> c17:In0 []; 75 | c20:Out0 -> c17:In1 []; 76 | } 77 | 78 | // lsums-lv8-no-hash-no-opt components: 16 +, 9 0, 25 total. Max depth: 8. 79 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Generic parallel scan 2 | 3 | A [talk given at the Silicon Valley Haskell meetup on October 5, 2016](https://www.meetup.com/haskellhackers/events/234242974/). 4 | 5 | * [Slides (PDF)](http://conal.net/talks/generic-parallel-scan.pdf) 6 | * Video link will appear here. 7 | 8 | 9 | ## Abstract 10 | 11 | This talk continues a theme from [*Generic FFT*], namely elegant, *generic* construction of efficient, parallel-friendly algorithms. By "generic" (also called "polytypic"), I mean structured via very simple and general data structure building blocks. Such developments produce not just a single algorithm, but an infinite family of algorithms, one for each data structure that can be assembled from the building blocks. 12 | 13 | This time, we'll delve into (parallel) prefix computations---known as "scans" to functional programmers. Starting with a simple definition that performs linear work and takes linear time even in a parallel setting, we then consider each of the six generic building blocks of data structures. Four have cheap and easy scans, while the remaining two (functor product and composition) provide opportunities for parallel evaluation. Among the many different scan algorithms that arise for different data types, two at least are well-known. Both perform in $O(\log n)$ parallel time (given sufficient computational resources), while one does work $O(n \log n)$ work and the other $O(n)$. 14 | 15 | These two scan algorithms fall out "for free" from right- vs left-association of functor compositions, revealing a hidden unity in what had appeared to be very different well-known algorithms. These data types, which I call (generalized) "top-down" and "bottom-up" trees, are exactly the same as we saw give rise to the well-known FFT algorithms "decimation in time" and "decimation in frequency" (DIT & DIF). I'll also show a bushier tree type that offers a compromise between the merits of top-down and bottom-up scans. FFT for bushes appears to improve over both DIT & DIF on both axes. 16 | 17 | As with generic FFT, the star of the show is functor composition. The generic approach is more successful for scan than for FFT, however, since it applies to all six basic building blocks and thus works for a much larger collection of data types, including products and sums. 18 | 19 | Three years ago at our meetup, I gave a talk called [*Understanding efficient parallel scan*]. 20 | While coming to similar conclusions, the new presentation is almost entirely different: 21 | 22 | * Much more emphasis on examples and intuition. 23 | * Generic programming takes center stage throughout. 24 | * Shape-indexed data types (vectors, trees, bushes). 25 | * Dropped the CUDA comparison. 26 | * Postponed complexity analysis to another talk unless there's time & interest. 27 | 28 | [*Generic FFT*]: https://github.com/conal/talk-2016-generic-fft "talk by Conal Elliott (2016)" 29 | 30 | [*Understanding efficient parallel scan*]: https://github.com/conal/talk-2013-understanding-parallel-scan "talk by Conal Elliott (2013)" 31 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-lv3olv4-highlight.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_lv3olv4 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.2"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}" color=red,style=bold]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}" color=red,style=bold]; 17 | c10 [label="{{|}|+|{}}"]; 18 | c11 [label="{{|}|+|{}}"]; 19 | c12 [label="{{|}|+|{}}"]; 20 | c13 [label="{{|}|+|{}}"]; 21 | c14 [label="{{|}|+|{}}"]; 22 | c15 [label="{{|}|+|{}}"]; 23 | c16 [label="{{|}|+|{}}"]; 24 | c17 [label="{{|}|+|{}}" color=red,style=bold]; 25 | c18 [label="{0|{}}" color=red,style=bold]; 26 | c19 [label="{In|{|||||||||||}}"]; 27 | c20 [label="{{||||||||||||}|Out}"]; 28 | c19:Out0 -> c1:In0 []; 29 | c19:Out1 -> c1:In1 []; 30 | c19:Out4 -> c2:In0 []; 31 | c19:Out5 -> c2:In1 []; 32 | c19:Out8 -> c3:In0 []; 33 | c19:Out9 -> c3:In1 []; 34 | c1:Out0 -> c4:In0 []; 35 | c19:Out2 -> c4:In1 []; 36 | c4:Out0 -> c5:In0 []; 37 | c19:Out3 -> c5:In1 []; 38 | c5:Out0 -> c6:In0 [color=red,style=bold]; 39 | c19:Out4 -> c6:In1 []; 40 | c5:Out0 -> c7:In0 [color=red,style=bold]; 41 | c2:Out0 -> c7:In1 []; 42 | c5:Out0 -> c8:In0 [color=red,style=bold]; 43 | c10:Out0 -> c8:In1 []; 44 | c5:Out0 -> c9:In0 [color=red,style=bold]; 45 | c11:Out0 -> c9:In1 []; 46 | c2:Out0 -> c10:In0 []; 47 | c19:Out6 -> c10:In1 []; 48 | c10:Out0 -> c11:In0 []; 49 | c19:Out7 -> c11:In1 []; 50 | c3:Out0 -> c12:In0 []; 51 | c19:Out10 -> c12:In1 []; 52 | c12:Out0 -> c13:In0 []; 53 | c19:Out11 -> c13:In1 []; 54 | c9:Out0 -> c14:In0 [color=red,style=bold]; 55 | c19:Out8 -> c14:In1 []; 56 | c9:Out0 -> c15:In0 [color=red,style=bold]; 57 | c3:Out0 -> c15:In1 []; 58 | c9:Out0 -> c16:In0 [color=red,style=bold]; 59 | c12:Out0 -> c16:In1 []; 60 | c9:Out0 -> c17:In0 [color=red,style=bold]; 61 | c13:Out0 -> c17:In1 []; 62 | c18:Out0 -> c20:In0 [color=red,style=bold]; 63 | c19:Out0 -> c20:In1 []; 64 | c1:Out0 -> c20:In2 []; 65 | c4:Out0 -> c20:In3 []; 66 | c5:Out0 -> c20:In4 [color=red,style=bold]; 67 | c6:Out0 -> c20:In5 []; 68 | c7:Out0 -> c20:In6 []; 69 | c8:Out0 -> c20:In7 []; 70 | c9:Out0 -> c20:In8 [color=red,style=bold]; 71 | c14:Out0 -> c20:In9 []; 72 | c15:Out0 -> c20:In10 []; 73 | c16:Out0 -> c20:In11 []; 74 | c17:Out0 -> c20:In12 [color=red,style=bold]; 75 | } 76 | 77 | // lsums-lv3olv4 components: 17 +, 1 0, 18 total. Max depth: 5. 78 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-lv11xlv5.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_lv11xlv5 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="0.75"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}"]; 17 | c10 [label="{{|}|+|{}}"]; 18 | c11 [label="{{|}|+|{}}"]; 19 | c12 [label="{{|}|+|{}}"]; 20 | c13 [label="{{|}|+|{}}"]; 21 | c14 [label="{{|}|+|{}}"]; 22 | c15 [label="{{|}|+|{}}"]; 23 | c16 [label="{{|}|+|{}}"]; 24 | c17 [label="{{|}|+|{}}"]; 25 | c18 [label="{{|}|+|{}}"]; 26 | c19 [label="{{|}|+|{}}"]; 27 | c20 [label="{0|{}}"]; 28 | c21 [label="{In|{|||||||||||||||}}"]; 29 | c22 [label="{{||||||||||||||||}|Out}"]; 30 | c21:Out0 -> c1:In0 []; 31 | c21:Out1 -> c1:In1 []; 32 | c21:Out11 -> c2:In0 []; 33 | c21:Out12 -> c2:In1 []; 34 | c2:Out0 -> c3:In0 []; 35 | c21:Out13 -> c3:In1 []; 36 | c3:Out0 -> c4:In0 []; 37 | c21:Out14 -> c4:In1 []; 38 | c4:Out0 -> c5:In0 []; 39 | c21:Out15 -> c5:In1 []; 40 | c1:Out0 -> c6:In0 []; 41 | c21:Out2 -> c6:In1 []; 42 | c6:Out0 -> c7:In0 []; 43 | c21:Out3 -> c7:In1 []; 44 | c7:Out0 -> c8:In0 []; 45 | c21:Out4 -> c8:In1 []; 46 | c8:Out0 -> c9:In0 []; 47 | c21:Out5 -> c9:In1 []; 48 | c9:Out0 -> c10:In0 []; 49 | c21:Out6 -> c10:In1 []; 50 | c10:Out0 -> c11:In0 []; 51 | c21:Out7 -> c11:In1 []; 52 | c11:Out0 -> c12:In0 []; 53 | c21:Out8 -> c12:In1 []; 54 | c12:Out0 -> c13:In0 []; 55 | c21:Out9 -> c13:In1 []; 56 | c13:Out0 -> c14:In0 []; 57 | c21:Out10 -> c14:In1 []; 58 | c14:Out0 -> c15:In0 []; 59 | c21:Out11 -> c15:In1 []; 60 | c14:Out0 -> c16:In0 []; 61 | c2:Out0 -> c16:In1 []; 62 | c14:Out0 -> c17:In0 []; 63 | c3:Out0 -> c17:In1 []; 64 | c14:Out0 -> c18:In0 []; 65 | c4:Out0 -> c18:In1 []; 66 | c14:Out0 -> c19:In0 []; 67 | c5:Out0 -> c19:In1 []; 68 | c20:Out0 -> c22:In0 []; 69 | c21:Out0 -> c22:In1 []; 70 | c1:Out0 -> c22:In2 []; 71 | c6:Out0 -> c22:In3 []; 72 | c7:Out0 -> c22:In4 []; 73 | c8:Out0 -> c22:In5 []; 74 | c9:Out0 -> c22:In6 []; 75 | c10:Out0 -> c22:In7 []; 76 | c11:Out0 -> c22:In8 []; 77 | c12:Out0 -> c22:In9 []; 78 | c13:Out0 -> c22:In10 []; 79 | c14:Out0 -> c22:In11 []; 80 | c15:Out0 -> c22:In12 []; 81 | c16:Out0 -> c22:In13 []; 82 | c17:Out0 -> c22:In14 []; 83 | c18:Out0 -> c22:In15 []; 84 | c19:Out0 -> c22:In16 []; 85 | } 86 | 87 | // lsums-lv11xlv5 components: 19 +, 1 0, 20 total. Max depth: 11. 88 | -------------------------------------------------------------------------------- /Figures/circuits/lsumsp-lv8-lv8-unknown.dot: -------------------------------------------------------------------------------- 1 | digraph lsumsp_lv8_lv8_unkown { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.0"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}"]; 17 | c10 [label="{{|}|+|{}}"]; 18 | c11 [label="{{|}|+|{}}"]; 19 | c12 [label="{{|}|+|{}}"]; 20 | c13 [label="{{|}|+|{}}"]; 21 | c14 [label="{{|}|+|{}}"]; 22 | c16 [label="{{|||||||||||||||}|??|{|||||||||||||||}}"]; 23 | c17 [label="{In|{|||||||||||||||}}"]; 24 | c18 [label="{{|||||||||||||||}|Out}"]; 25 | c17:Out0 -> c1:In0 []; 26 | c17:Out1 -> c1:In1 []; 27 | c17:Out8 -> c2:In0 []; 28 | c17:Out9 -> c2:In1 []; 29 | c1:Out0 -> c3:In0 []; 30 | c17:Out2 -> c3:In1 []; 31 | c3:Out0 -> c4:In0 []; 32 | c17:Out3 -> c4:In1 []; 33 | c4:Out0 -> c5:In0 []; 34 | c17:Out4 -> c5:In1 []; 35 | c5:Out0 -> c6:In0 []; 36 | c17:Out5 -> c6:In1 []; 37 | c6:Out0 -> c7:In0 []; 38 | c17:Out6 -> c7:In1 []; 39 | c7:Out0 -> c8:In0 []; 40 | c17:Out7 -> c8:In1 []; 41 | c2:Out0 -> c9:In0 []; 42 | c17:Out10 -> c9:In1 []; 43 | c9:Out0 -> c10:In0 []; 44 | c17:Out11 -> c10:In1 []; 45 | c10:Out0 -> c11:In0 []; 46 | c17:Out12 -> c11:In1 []; 47 | c11:Out0 -> c12:In0 []; 48 | c17:Out13 -> c12:In1 []; 49 | c12:Out0 -> c13:In0 []; 50 | c17:Out14 -> c13:In1 []; 51 | c13:Out0 -> c14:In0 []; 52 | c17:Out15 -> c14:In1 []; 53 | c17:Out0 -> c16:In0 []; 54 | c1:Out0 -> c16:In1 []; 55 | c3:Out0 -> c16:In2 []; 56 | c4:Out0 -> c16:In3 []; 57 | c5:Out0 -> c16:In4 []; 58 | c6:Out0 -> c16:In5 []; 59 | c7:Out0 -> c16:In6 []; 60 | c8:Out0 -> c16:In7 []; 61 | c17:Out8 -> c16:In8 []; 62 | c2:Out0 -> c16:In9 []; 63 | c9:Out0 -> c16:In10 []; 64 | c10:Out0 -> c16:In11 []; 65 | c11:Out0 -> c16:In12 []; 66 | c12:Out0 -> c16:In13 []; 67 | c13:Out0 -> c16:In14 []; 68 | c14:Out0 -> c16:In15 []; 69 | c16:Out0 -> c18:In0 []; 70 | c16:Out1 -> c18:In1 []; 71 | c16:Out2 -> c18:In2 []; 72 | c16:Out3 -> c18:In3 []; 73 | c16:Out4 -> c18:In4 []; 74 | c16:Out5 -> c18:In5 []; 75 | c16:Out6 -> c18:In6 []; 76 | c16:Out7 -> c18:In7 []; 77 | c16:Out8 -> c18:In8 []; 78 | c16:Out9 -> c18:In9 []; 79 | c16:Out10 -> c18:In10 []; 80 | c16:Out11 -> c18:In11 []; 81 | c16:Out12 -> c18:In12 []; 82 | c16:Out13 -> c18:In13 []; 83 | c16:Out14 -> c18:In14 []; 84 | c16:Out15 -> c18:In15 []; 85 | } 86 | 87 | // lsumsp-lv8-lv8-unkown components: 14 +, 1 ??, 15 total. Max depth: 8. 88 | -------------------------------------------------------------------------------- /Figures/circuits/lsumsp-p-lv8.dot: -------------------------------------------------------------------------------- 1 | digraph lsumsp_p_lv8 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.0"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}"]; 17 | c10 [label="{{|}|+|{}}"]; 18 | c11 [label="{{|}|+|{}}"]; 19 | c12 [label="{{|}|+|{}}"]; 20 | c13 [label="{{|}|+|{}}"]; 21 | c14 [label="{{|}|+|{}}"]; 22 | c15 [label="{{|}|+|{}}"]; 23 | c16 [label="{{|}|+|{}}"]; 24 | c17 [label="{{|}|+|{}}"]; 25 | c18 [label="{{|}|+|{}}"]; 26 | c19 [label="{{|}|+|{}}"]; 27 | c20 [label="{{|}|+|{}}"]; 28 | c21 [label="{{|}|+|{}}"]; 29 | c22 [label="{{|}|+|{}}"]; 30 | c24 [label="{In|{|||||||||||||||}}"]; 31 | c25 [label="{{|||||||||||||||}|Out}"]; 32 | c24:Out0 -> c1:In0 []; 33 | c24:Out1 -> c1:In1 []; 34 | c24:Out8 -> c2:In0 []; 35 | c24:Out9 -> c2:In1 []; 36 | c1:Out0 -> c3:In0 []; 37 | c24:Out2 -> c3:In1 []; 38 | c3:Out0 -> c4:In0 []; 39 | c24:Out3 -> c4:In1 []; 40 | c4:Out0 -> c5:In0 []; 41 | c24:Out4 -> c5:In1 []; 42 | c5:Out0 -> c6:In0 []; 43 | c24:Out5 -> c6:In1 []; 44 | c6:Out0 -> c7:In0 []; 45 | c24:Out6 -> c7:In1 []; 46 | c7:Out0 -> c8:In0 []; 47 | c24:Out7 -> c8:In1 []; 48 | c8:Out0 -> c9:In0 []; 49 | c24:Out8 -> c9:In1 []; 50 | c8:Out0 -> c10:In0 []; 51 | c2:Out0 -> c10:In1 []; 52 | c8:Out0 -> c11:In0 []; 53 | c17:Out0 -> c11:In1 []; 54 | c8:Out0 -> c12:In0 []; 55 | c18:Out0 -> c12:In1 []; 56 | c8:Out0 -> c13:In0 []; 57 | c19:Out0 -> c13:In1 []; 58 | c8:Out0 -> c14:In0 []; 59 | c20:Out0 -> c14:In1 []; 60 | c8:Out0 -> c15:In0 []; 61 | c21:Out0 -> c15:In1 []; 62 | c8:Out0 -> c16:In0 []; 63 | c22:Out0 -> c16:In1 []; 64 | c2:Out0 -> c17:In0 []; 65 | c24:Out10 -> c17:In1 []; 66 | c17:Out0 -> c18:In0 []; 67 | c24:Out11 -> c18:In1 []; 68 | c18:Out0 -> c19:In0 []; 69 | c24:Out12 -> c19:In1 []; 70 | c19:Out0 -> c20:In0 []; 71 | c24:Out13 -> c20:In1 []; 72 | c20:Out0 -> c21:In0 []; 73 | c24:Out14 -> c21:In1 []; 74 | c21:Out0 -> c22:In0 []; 75 | c24:Out15 -> c22:In1 []; 76 | c24:Out0 -> c25:In0 []; 77 | c1:Out0 -> c25:In1 []; 78 | c3:Out0 -> c25:In2 []; 79 | c4:Out0 -> c25:In3 []; 80 | c5:Out0 -> c25:In4 []; 81 | c6:Out0 -> c25:In5 []; 82 | c7:Out0 -> c25:In6 []; 83 | c8:Out0 -> c25:In7 []; 84 | c9:Out0 -> c25:In8 []; 85 | c10:Out0 -> c25:In9 []; 86 | c11:Out0 -> c25:In10 []; 87 | c12:Out0 -> c25:In11 []; 88 | c13:Out0 -> c25:In12 []; 89 | c14:Out0 -> c25:In13 []; 90 | c15:Out0 -> c25:In14 []; 91 | c16:Out0 -> c25:In15 []; 92 | } 93 | 94 | // lsumsp-p-lv8 components: 22 +. Max depth: 8. 95 | -------------------------------------------------------------------------------- /Figures/circuits/lsumsp-lv8-p.dot: -------------------------------------------------------------------------------- 1 | digraph lsumsp_lv8_p { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.1"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}"]; 17 | c10 [label="{{|}|+|{}}"]; 18 | c11 [label="{{|}|+|{}}"]; 19 | c12 [label="{{|}|+|{}}"]; 20 | c13 [label="{{|}|+|{}}"]; 21 | c14 [label="{{|}|+|{}}"]; 22 | c15 [label="{{|}|+|{}}"]; 23 | c16 [label="{{|}|+|{}}"]; 24 | c17 [label="{{|}|+|{}}"]; 25 | c18 [label="{{|}|+|{}}"]; 26 | c19 [label="{{|}|+|{}}"]; 27 | c20 [label="{{|}|+|{}}"]; 28 | c21 [label="{{|}|+|{}}"]; 29 | c22 [label="{{|}|+|{}}"]; 30 | c24 [label="{In|{|||||||||||||||}}"]; 31 | c25 [label="{{|||||||||||||||}|Out}"]; 32 | c24:Out0 -> c1:In0 []; 33 | c24:Out1 -> c1:In1 []; 34 | c24:Out2 -> c2:In0 []; 35 | c24:Out3 -> c2:In1 []; 36 | c24:Out4 -> c3:In0 []; 37 | c24:Out5 -> c3:In1 []; 38 | c24:Out6 -> c4:In0 []; 39 | c24:Out7 -> c4:In1 []; 40 | c24:Out8 -> c5:In0 []; 41 | c24:Out9 -> c5:In1 []; 42 | c24:Out10 -> c6:In0 []; 43 | c24:Out11 -> c6:In1 []; 44 | c24:Out12 -> c7:In0 []; 45 | c24:Out13 -> c7:In1 []; 46 | c24:Out14 -> c8:In0 []; 47 | c24:Out15 -> c8:In1 []; 48 | c1:Out0 -> c9:In0 []; 49 | c24:Out2 -> c9:In1 []; 50 | c1:Out0 -> c10:In0 []; 51 | c2:Out0 -> c10:In1 []; 52 | c10:Out0 -> c11:In0 []; 53 | c24:Out4 -> c11:In1 []; 54 | c10:Out0 -> c12:In0 []; 55 | c3:Out0 -> c12:In1 []; 56 | c12:Out0 -> c13:In0 []; 57 | c24:Out6 -> c13:In1 []; 58 | c12:Out0 -> c14:In0 []; 59 | c4:Out0 -> c14:In1 []; 60 | c14:Out0 -> c15:In0 []; 61 | c24:Out8 -> c15:In1 []; 62 | c14:Out0 -> c16:In0 []; 63 | c5:Out0 -> c16:In1 []; 64 | c16:Out0 -> c17:In0 []; 65 | c24:Out10 -> c17:In1 []; 66 | c16:Out0 -> c18:In0 []; 67 | c6:Out0 -> c18:In1 []; 68 | c18:Out0 -> c19:In0 []; 69 | c24:Out12 -> c19:In1 []; 70 | c18:Out0 -> c20:In0 []; 71 | c7:Out0 -> c20:In1 []; 72 | c20:Out0 -> c21:In0 []; 73 | c24:Out14 -> c21:In1 []; 74 | c20:Out0 -> c22:In0 []; 75 | c8:Out0 -> c22:In1 []; 76 | c24:Out0 -> c25:In0 []; 77 | c1:Out0 -> c25:In1 []; 78 | c9:Out0 -> c25:In2 []; 79 | c10:Out0 -> c25:In3 []; 80 | c11:Out0 -> c25:In4 []; 81 | c12:Out0 -> c25:In5 []; 82 | c13:Out0 -> c25:In6 []; 83 | c14:Out0 -> c25:In7 []; 84 | c15:Out0 -> c25:In8 []; 85 | c16:Out0 -> c25:In9 []; 86 | c17:Out0 -> c25:In10 []; 87 | c18:Out0 -> c25:In11 []; 88 | c19:Out0 -> c25:In12 []; 89 | c20:Out0 -> c25:In13 []; 90 | c21:Out0 -> c25:In14 []; 91 | c22:Out0 -> c25:In15 []; 92 | } 93 | 94 | // lsumsp-lv8-p components: 22 +. Max depth: 8. 95 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-lv4olv4-unknown-no-hash.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_lv4olv4_unknown_no_hash { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="2.7"; 8 | c0 [label="{{||||||||||||||||}|Out}"]; 9 | c1 [label="{{|||||||||||||||||||}|??|{||||||||||||||||}}",fontcolor=red,color=red,style=bold]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{0|{}}"]; 14 | c15 [label="{{|}|+|{}}"]; 15 | c16 [label="{{|}|+|{}}"]; 16 | c17 [label="{{|}|+|{}}"]; 17 | c18 [label="{0|{}}"]; 18 | c27 [label="{{|}|+|{}}"]; 19 | c28 [label="{{|}|+|{}}"]; 20 | c29 [label="{{|}|+|{}}"]; 21 | c30 [label="{0|{}}"]; 22 | c39 [label="{{|}|+|{}}"]; 23 | c40 [label="{{|}|+|{}}"]; 24 | c41 [label="{{|}|+|{}}"]; 25 | c42 [label="{0|{}}"]; 26 | c51 [label="{In|{|||||||||||||||}}"]; 27 | c1:Out0 -> c0:In0 []; 28 | c1:Out1 -> c0:In1 []; 29 | c1:Out2 -> c0:In2 []; 30 | c1:Out3 -> c0:In3 []; 31 | c1:Out4 -> c0:In4 []; 32 | c1:Out5 -> c0:In5 []; 33 | c1:Out6 -> c0:In6 []; 34 | c1:Out7 -> c0:In7 []; 35 | c1:Out8 -> c0:In8 []; 36 | c1:Out9 -> c0:In9 []; 37 | c1:Out10 -> c0:In10 []; 38 | c1:Out11 -> c0:In11 []; 39 | c1:Out12 -> c0:In12 []; 40 | c1:Out13 -> c0:In13 []; 41 | c1:Out14 -> c0:In14 []; 42 | c1:Out15 -> c0:In15 []; 43 | c1:Out16 -> c0:In16 []; 44 | c42:Out0 -> c1:In0 []; 45 | c51:Out0 -> c1:In1 []; 46 | c41:Out0 -> c1:In2 []; 47 | c40:Out0 -> c1:In3 []; 48 | c39:Out0 -> c1:In4 []; 49 | c30:Out0 -> c1:In5 []; 50 | c51:Out4 -> c1:In6 []; 51 | c29:Out0 -> c1:In7 []; 52 | c28:Out0 -> c1:In8 []; 53 | c27:Out0 -> c1:In9 []; 54 | c18:Out0 -> c1:In10 []; 55 | c51:Out8 -> c1:In11 []; 56 | c17:Out0 -> c1:In12 []; 57 | c16:Out0 -> c1:In13 []; 58 | c15:Out0 -> c1:In14 []; 59 | c6:Out0 -> c1:In15 []; 60 | c51:Out12 -> c1:In16 []; 61 | c5:Out0 -> c1:In17 []; 62 | c4:Out0 -> c1:In18 []; 63 | c3:Out0 -> c1:In19 []; 64 | c4:Out0 -> c3:In0 []; 65 | c51:Out15 -> c3:In1 []; 66 | c5:Out0 -> c4:In0 []; 67 | c51:Out14 -> c4:In1 []; 68 | c51:Out12 -> c5:In0 []; 69 | c51:Out13 -> c5:In1 []; 70 | c16:Out0 -> c15:In0 []; 71 | c51:Out11 -> c15:In1 []; 72 | c17:Out0 -> c16:In0 []; 73 | c51:Out10 -> c16:In1 []; 74 | c51:Out8 -> c17:In0 []; 75 | c51:Out9 -> c17:In1 []; 76 | c28:Out0 -> c27:In0 []; 77 | c51:Out7 -> c27:In1 []; 78 | c29:Out0 -> c28:In0 []; 79 | c51:Out6 -> c28:In1 []; 80 | c51:Out4 -> c29:In0 []; 81 | c51:Out5 -> c29:In1 []; 82 | c40:Out0 -> c39:In0 []; 83 | c51:Out3 -> c39:In1 []; 84 | c41:Out0 -> c40:In0 []; 85 | c51:Out2 -> c40:In1 []; 86 | c51:Out0 -> c41:In0 []; 87 | c51:Out1 -> c41:In1 []; 88 | } 89 | 90 | // lsums-lv4olv4-unknown-no-hash components: 12 +, 4 0, 1 ??, 17 total. Max depth: 4. 91 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-p-lv8.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_p_lv8 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.0"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}"]; 17 | c10 [label="{{|}|+|{}}"]; 18 | c11 [label="{{|}|+|{}}"]; 19 | c12 [label="{{|}|+|{}}"]; 20 | c13 [label="{{|}|+|{}}"]; 21 | c14 [label="{{|}|+|{}}"]; 22 | c15 [label="{{|}|+|{}}"]; 23 | c16 [label="{{|}|+|{}}"]; 24 | c17 [label="{{|}|+|{}}"]; 25 | c18 [label="{{|}|+|{}}"]; 26 | c19 [label="{{|}|+|{}}"]; 27 | c20 [label="{{|}|+|{}}"]; 28 | c21 [label="{{|}|+|{}}"]; 29 | c22 [label="{{|}|+|{}}"]; 30 | c23 [label="{0|{}}"]; 31 | c24 [label="{In|{|||||||||||||||}}"]; 32 | c25 [label="{{||||||||||||||||}|Out}"]; 33 | c24:Out0 -> c1:In0 []; 34 | c24:Out1 -> c1:In1 []; 35 | c24:Out8 -> c2:In0 []; 36 | c24:Out9 -> c2:In1 []; 37 | c1:Out0 -> c3:In0 []; 38 | c24:Out2 -> c3:In1 []; 39 | c3:Out0 -> c4:In0 []; 40 | c24:Out3 -> c4:In1 []; 41 | c4:Out0 -> c5:In0 []; 42 | c24:Out4 -> c5:In1 []; 43 | c5:Out0 -> c6:In0 []; 44 | c24:Out5 -> c6:In1 []; 45 | c6:Out0 -> c7:In0 []; 46 | c24:Out6 -> c7:In1 []; 47 | c7:Out0 -> c8:In0 []; 48 | c24:Out7 -> c8:In1 []; 49 | c8:Out0 -> c9:In0 []; 50 | c24:Out8 -> c9:In1 []; 51 | c8:Out0 -> c10:In0 []; 52 | c2:Out0 -> c10:In1 []; 53 | c8:Out0 -> c11:In0 []; 54 | c17:Out0 -> c11:In1 []; 55 | c8:Out0 -> c12:In0 []; 56 | c18:Out0 -> c12:In1 []; 57 | c8:Out0 -> c13:In0 []; 58 | c19:Out0 -> c13:In1 []; 59 | c8:Out0 -> c14:In0 []; 60 | c20:Out0 -> c14:In1 []; 61 | c8:Out0 -> c15:In0 []; 62 | c21:Out0 -> c15:In1 []; 63 | c8:Out0 -> c16:In0 []; 64 | c22:Out0 -> c16:In1 []; 65 | c2:Out0 -> c17:In0 []; 66 | c24:Out10 -> c17:In1 []; 67 | c17:Out0 -> c18:In0 []; 68 | c24:Out11 -> c18:In1 []; 69 | c18:Out0 -> c19:In0 []; 70 | c24:Out12 -> c19:In1 []; 71 | c19:Out0 -> c20:In0 []; 72 | c24:Out13 -> c20:In1 []; 73 | c20:Out0 -> c21:In0 []; 74 | c24:Out14 -> c21:In1 []; 75 | c21:Out0 -> c22:In0 []; 76 | c24:Out15 -> c22:In1 []; 77 | c23:Out0 -> c25:In0 []; 78 | c24:Out0 -> c25:In1 []; 79 | c1:Out0 -> c25:In2 []; 80 | c3:Out0 -> c25:In3 []; 81 | c4:Out0 -> c25:In4 []; 82 | c5:Out0 -> c25:In5 []; 83 | c6:Out0 -> c25:In6 []; 84 | c7:Out0 -> c25:In7 []; 85 | c8:Out0 -> c25:In8 []; 86 | c9:Out0 -> c25:In9 []; 87 | c10:Out0 -> c25:In10 []; 88 | c11:Out0 -> c25:In11 []; 89 | c12:Out0 -> c25:In12 []; 90 | c13:Out0 -> c25:In13 []; 91 | c14:Out0 -> c25:In14 []; 92 | c15:Out0 -> c25:In15 []; 93 | c16:Out0 -> c25:In16 []; 94 | } 95 | 96 | // lsums-p-lv8 components: 22 +, 1 0, 23 total. Max depth: 8. 97 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-lv8-lv8-unknown-no-hash.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_lv8_lv8_unknown_no_hash { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.0"; 8 | c0 [label="{{||||||||||||||||}|Out}"]; 9 | c1 [label="{{|||||||||||||||||}|??|{||||||||||||||||}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}"]; 17 | c10 [label="{0|{}}"]; 18 | c23 [label="{{|}|+|{}}"]; 19 | c24 [label="{{|}|+|{}}"]; 20 | c25 [label="{{|}|+|{}}"]; 21 | c26 [label="{{|}|+|{}}"]; 22 | c27 [label="{{|}|+|{}}"]; 23 | c28 [label="{{|}|+|{}}"]; 24 | c29 [label="{{|}|+|{}}"]; 25 | c30 [label="{0|{}}"]; 26 | c42 [label="{In|{|||||||||||||||}}"]; 27 | c1:Out0 -> c0:In0 []; 28 | c1:Out1 -> c0:In1 []; 29 | c1:Out2 -> c0:In2 []; 30 | c1:Out3 -> c0:In3 []; 31 | c1:Out4 -> c0:In4 []; 32 | c1:Out5 -> c0:In5 []; 33 | c1:Out6 -> c0:In6 []; 34 | c1:Out7 -> c0:In7 []; 35 | c1:Out8 -> c0:In8 []; 36 | c1:Out9 -> c0:In9 []; 37 | c1:Out10 -> c0:In10 []; 38 | c1:Out11 -> c0:In11 []; 39 | c1:Out12 -> c0:In12 []; 40 | c1:Out13 -> c0:In13 []; 41 | c1:Out14 -> c0:In14 []; 42 | c1:Out15 -> c0:In15 []; 43 | c1:Out16 -> c0:In16 []; 44 | c30:Out0 -> c1:In0 []; 45 | c42:Out0 -> c1:In1 []; 46 | c29:Out0 -> c1:In2 []; 47 | c28:Out0 -> c1:In3 []; 48 | c27:Out0 -> c1:In4 []; 49 | c26:Out0 -> c1:In5 []; 50 | c25:Out0 -> c1:In6 []; 51 | c24:Out0 -> c1:In7 []; 52 | c23:Out0 -> c1:In8 []; 53 | c10:Out0 -> c1:In9 []; 54 | c42:Out8 -> c1:In10 []; 55 | c9:Out0 -> c1:In11 []; 56 | c8:Out0 -> c1:In12 []; 57 | c7:Out0 -> c1:In13 []; 58 | c6:Out0 -> c1:In14 []; 59 | c5:Out0 -> c1:In15 []; 60 | c4:Out0 -> c1:In16 []; 61 | c3:Out0 -> c1:In17 []; 62 | c4:Out0 -> c3:In0 []; 63 | c42:Out15 -> c3:In1 []; 64 | c5:Out0 -> c4:In0 []; 65 | c42:Out14 -> c4:In1 []; 66 | c6:Out0 -> c5:In0 []; 67 | c42:Out13 -> c5:In1 []; 68 | c7:Out0 -> c6:In0 []; 69 | c42:Out12 -> c6:In1 []; 70 | c8:Out0 -> c7:In0 []; 71 | c42:Out11 -> c7:In1 []; 72 | c9:Out0 -> c8:In0 []; 73 | c42:Out10 -> c8:In1 []; 74 | c42:Out8 -> c9:In0 []; 75 | c42:Out9 -> c9:In1 []; 76 | c24:Out0 -> c23:In0 []; 77 | c42:Out7 -> c23:In1 []; 78 | c25:Out0 -> c24:In0 []; 79 | c42:Out6 -> c24:In1 []; 80 | c26:Out0 -> c25:In0 []; 81 | c42:Out5 -> c25:In1 []; 82 | c27:Out0 -> c26:In0 []; 83 | c42:Out4 -> c26:In1 []; 84 | c28:Out0 -> c27:In0 []; 85 | c42:Out3 -> c27:In1 []; 86 | c29:Out0 -> c28:In0 []; 87 | c42:Out2 -> c28:In1 []; 88 | c42:Out0 -> c29:In0 []; 89 | c42:Out1 -> c29:In1 []; 90 | } 91 | 92 | // lsums-lv8-lv8-unknown-no-hash components: 14 +, 2 0, 1 ??, 17 total. Max depth: 8. 93 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-lv8-p.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_lv8_p { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.0"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}"]; 17 | c10 [label="{{|}|+|{}}"]; 18 | c11 [label="{{|}|+|{}}"]; 19 | c12 [label="{{|}|+|{}}"]; 20 | c13 [label="{{|}|+|{}}"]; 21 | c14 [label="{{|}|+|{}}"]; 22 | c15 [label="{{|}|+|{}}"]; 23 | c16 [label="{{|}|+|{}}"]; 24 | c17 [label="{{|}|+|{}}"]; 25 | c18 [label="{{|}|+|{}}"]; 26 | c19 [label="{{|}|+|{}}"]; 27 | c20 [label="{{|}|+|{}}"]; 28 | c21 [label="{{|}|+|{}}"]; 29 | c22 [label="{{|}|+|{}}"]; 30 | c23 [label="{0|{}}"]; 31 | c24 [label="{In|{|||||||||||||||}}"]; 32 | c25 [label="{{||||||||||||||||}|Out}"]; 33 | c24:Out0 -> c1:In0 []; 34 | c24:Out1 -> c1:In1 []; 35 | c24:Out2 -> c2:In0 []; 36 | c24:Out3 -> c2:In1 []; 37 | c24:Out4 -> c3:In0 []; 38 | c24:Out5 -> c3:In1 []; 39 | c24:Out6 -> c4:In0 []; 40 | c24:Out7 -> c4:In1 []; 41 | c24:Out8 -> c5:In0 []; 42 | c24:Out9 -> c5:In1 []; 43 | c24:Out10 -> c6:In0 []; 44 | c24:Out11 -> c6:In1 []; 45 | c24:Out12 -> c7:In0 []; 46 | c24:Out13 -> c7:In1 []; 47 | c24:Out14 -> c8:In0 []; 48 | c24:Out15 -> c8:In1 []; 49 | c1:Out0 -> c9:In0 []; 50 | c24:Out2 -> c9:In1 []; 51 | c1:Out0 -> c10:In0 []; 52 | c2:Out0 -> c10:In1 []; 53 | c10:Out0 -> c11:In0 []; 54 | c24:Out4 -> c11:In1 []; 55 | c10:Out0 -> c12:In0 []; 56 | c3:Out0 -> c12:In1 []; 57 | c12:Out0 -> c13:In0 []; 58 | c24:Out6 -> c13:In1 []; 59 | c12:Out0 -> c14:In0 []; 60 | c4:Out0 -> c14:In1 []; 61 | c14:Out0 -> c15:In0 []; 62 | c24:Out8 -> c15:In1 []; 63 | c14:Out0 -> c16:In0 []; 64 | c5:Out0 -> c16:In1 []; 65 | c16:Out0 -> c17:In0 []; 66 | c24:Out10 -> c17:In1 []; 67 | c16:Out0 -> c18:In0 []; 68 | c6:Out0 -> c18:In1 []; 69 | c18:Out0 -> c19:In0 []; 70 | c24:Out12 -> c19:In1 []; 71 | c18:Out0 -> c20:In0 []; 72 | c7:Out0 -> c20:In1 []; 73 | c20:Out0 -> c21:In0 []; 74 | c24:Out14 -> c21:In1 []; 75 | c20:Out0 -> c22:In0 []; 76 | c8:Out0 -> c22:In1 []; 77 | c23:Out0 -> c25:In0 []; 78 | c24:Out0 -> c25:In1 []; 79 | c1:Out0 -> c25:In2 []; 80 | c9:Out0 -> c25:In3 []; 81 | c10:Out0 -> c25:In4 []; 82 | c11:Out0 -> c25:In5 []; 83 | c12:Out0 -> c25:In6 []; 84 | c13:Out0 -> c25:In7 []; 85 | c14:Out0 -> c25:In8 []; 86 | c15:Out0 -> c25:In9 []; 87 | c16:Out0 -> c25:In10 []; 88 | c17:Out0 -> c25:In11 []; 89 | c18:Out0 -> c25:In12 []; 90 | c19:Out0 -> c25:In13 []; 91 | c20:Out0 -> c25:In14 []; 92 | c21:Out0 -> c25:In15 []; 93 | c22:Out0 -> c25:In16 []; 94 | } 95 | 96 | // lsums-lv8-p components: 22 +, 1 0, 23 total. Max depth: 8. 97 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-lv8xlv8.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_lv8xlv8 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.0"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}"]; 17 | c10 [label="{{|}|+|{}}"]; 18 | c11 [label="{{|}|+|{}}"]; 19 | c12 [label="{{|}|+|{}}"]; 20 | c13 [label="{{|}|+|{}}"]; 21 | c14 [label="{{|}|+|{}}"]; 22 | c15 [label="{{|}|+|{}}"]; 23 | c16 [label="{{|}|+|{}}"]; 24 | c17 [label="{{|}|+|{}}"]; 25 | c18 [label="{{|}|+|{}}"]; 26 | c19 [label="{{|}|+|{}}"]; 27 | c20 [label="{{|}|+|{}}"]; 28 | c21 [label="{{|}|+|{}}"]; 29 | c22 [label="{{|}|+|{}}"]; 30 | c23 [label="{0|{}}"]; 31 | c24 [label="{In|{|||||||||||||||}}"]; 32 | c25 [label="{{||||||||||||||||}|Out}"]; 33 | c24:Out0 -> c1:In0 []; 34 | c24:Out1 -> c1:In1 []; 35 | c24:Out8 -> c2:In0 []; 36 | c24:Out9 -> c2:In1 []; 37 | c2:Out0 -> c3:In0 []; 38 | c24:Out10 -> c3:In1 []; 39 | c3:Out0 -> c4:In0 []; 40 | c24:Out11 -> c4:In1 []; 41 | c4:Out0 -> c5:In0 []; 42 | c24:Out12 -> c5:In1 []; 43 | c5:Out0 -> c6:In0 []; 44 | c24:Out13 -> c6:In1 []; 45 | c6:Out0 -> c7:In0 []; 46 | c24:Out14 -> c7:In1 []; 47 | c7:Out0 -> c8:In0 []; 48 | c24:Out15 -> c8:In1 []; 49 | c1:Out0 -> c9:In0 []; 50 | c24:Out2 -> c9:In1 []; 51 | c9:Out0 -> c10:In0 []; 52 | c24:Out3 -> c10:In1 []; 53 | c10:Out0 -> c11:In0 []; 54 | c24:Out4 -> c11:In1 []; 55 | c11:Out0 -> c12:In0 []; 56 | c24:Out5 -> c12:In1 []; 57 | c12:Out0 -> c13:In0 []; 58 | c24:Out6 -> c13:In1 []; 59 | c13:Out0 -> c14:In0 []; 60 | c24:Out7 -> c14:In1 []; 61 | c14:Out0 -> c15:In0 []; 62 | c24:Out8 -> c15:In1 []; 63 | c14:Out0 -> c16:In0 []; 64 | c2:Out0 -> c16:In1 []; 65 | c14:Out0 -> c17:In0 []; 66 | c3:Out0 -> c17:In1 []; 67 | c14:Out0 -> c18:In0 []; 68 | c4:Out0 -> c18:In1 []; 69 | c14:Out0 -> c19:In0 []; 70 | c5:Out0 -> c19:In1 []; 71 | c14:Out0 -> c20:In0 []; 72 | c6:Out0 -> c20:In1 []; 73 | c14:Out0 -> c21:In0 []; 74 | c7:Out0 -> c21:In1 []; 75 | c14:Out0 -> c22:In0 []; 76 | c8:Out0 -> c22:In1 []; 77 | c23:Out0 -> c25:In0 []; 78 | c24:Out0 -> c25:In1 []; 79 | c1:Out0 -> c25:In2 []; 80 | c9:Out0 -> c25:In3 []; 81 | c10:Out0 -> c25:In4 []; 82 | c11:Out0 -> c25:In5 []; 83 | c12:Out0 -> c25:In6 []; 84 | c13:Out0 -> c25:In7 []; 85 | c14:Out0 -> c25:In8 []; 86 | c15:Out0 -> c25:In9 []; 87 | c16:Out0 -> c25:In10 []; 88 | c17:Out0 -> c25:In11 []; 89 | c18:Out0 -> c25:In12 []; 90 | c19:Out0 -> c25:In13 []; 91 | c20:Out0 -> c25:In14 []; 92 | c21:Out0 -> c25:In15 []; 93 | c22:Out0 -> c25:In16 []; 94 | } 95 | 96 | // lsums-lv8xlv8 components: 22 +, 1 0, 23 total. Max depth: 8. 97 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-lv5-lv11-unknown-no-hash.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_lv5_lv11_unknown_no_hash { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="0.8"; 8 | c0 [label="{{||||||||||||||||}|Out}"]; 9 | c1 [label="{{|||||||||||||||||}|??|{||||||||||||||||}}",fontcolor=red,color=red,style=bold]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}"]; 17 | c10 [label="{{|}|+|{}}"]; 18 | c11 [label="{{|}|+|{}}"]; 19 | c12 [label="{{|}|+|{}}"]; 20 | c13 [label="{0|{}}"]; 21 | c29 [label="{{|}|+|{}}"]; 22 | c30 [label="{{|}|+|{}}"]; 23 | c31 [label="{{|}|+|{}}"]; 24 | c32 [label="{{|}|+|{}}"]; 25 | c33 [label="{0|{}}"]; 26 | c42 [label="{In|{|||||||||||||||}}"]; 27 | c1:Out0 -> c0:In0 []; 28 | c1:Out1 -> c0:In1 []; 29 | c1:Out2 -> c0:In2 []; 30 | c1:Out3 -> c0:In3 []; 31 | c1:Out4 -> c0:In4 []; 32 | c1:Out5 -> c0:In5 []; 33 | c1:Out6 -> c0:In6 []; 34 | c1:Out7 -> c0:In7 []; 35 | c1:Out8 -> c0:In8 []; 36 | c1:Out9 -> c0:In9 []; 37 | c1:Out10 -> c0:In10 []; 38 | c1:Out11 -> c0:In11 []; 39 | c1:Out12 -> c0:In12 []; 40 | c1:Out13 -> c0:In13 []; 41 | c1:Out14 -> c0:In14 []; 42 | c1:Out15 -> c0:In15 []; 43 | c1:Out16 -> c0:In16 []; 44 | c33:Out0 -> c1:In0 []; 45 | c42:Out0 -> c1:In1 []; 46 | c32:Out0 -> c1:In2 []; 47 | c31:Out0 -> c1:In3 []; 48 | c30:Out0 -> c1:In4 []; 49 | c29:Out0 -> c1:In5 []; 50 | c13:Out0 -> c1:In6 []; 51 | c42:Out5 -> c1:In7 []; 52 | c12:Out0 -> c1:In8 []; 53 | c11:Out0 -> c1:In9 []; 54 | c10:Out0 -> c1:In10 []; 55 | c9:Out0 -> c1:In11 []; 56 | c8:Out0 -> c1:In12 []; 57 | c7:Out0 -> c1:In13 []; 58 | c6:Out0 -> c1:In14 []; 59 | c5:Out0 -> c1:In15 []; 60 | c4:Out0 -> c1:In16 []; 61 | c3:Out0 -> c1:In17 []; 62 | c4:Out0 -> c3:In0 []; 63 | c42:Out15 -> c3:In1 []; 64 | c5:Out0 -> c4:In0 []; 65 | c42:Out14 -> c4:In1 []; 66 | c6:Out0 -> c5:In0 []; 67 | c42:Out13 -> c5:In1 []; 68 | c7:Out0 -> c6:In0 []; 69 | c42:Out12 -> c6:In1 []; 70 | c8:Out0 -> c7:In0 []; 71 | c42:Out11 -> c7:In1 []; 72 | c9:Out0 -> c8:In0 []; 73 | c42:Out10 -> c8:In1 []; 74 | c10:Out0 -> c9:In0 []; 75 | c42:Out9 -> c9:In1 []; 76 | c11:Out0 -> c10:In0 []; 77 | c42:Out8 -> c10:In1 []; 78 | c12:Out0 -> c11:In0 []; 79 | c42:Out7 -> c11:In1 []; 80 | c42:Out5 -> c12:In0 []; 81 | c42:Out6 -> c12:In1 []; 82 | c30:Out0 -> c29:In0 []; 83 | c42:Out4 -> c29:In1 []; 84 | c31:Out0 -> c30:In0 []; 85 | c42:Out3 -> c30:In1 []; 86 | c32:Out0 -> c31:In0 []; 87 | c42:Out2 -> c31:In1 []; 88 | c42:Out0 -> c32:In0 []; 89 | c42:Out1 -> c32:In1 []; 90 | } 91 | 92 | // lsums-lv5-lv11-unknown-no-hash components: 14 +, 2 0, 1 ??, 17 total. Max depth: 11. 93 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-lv5-lv11-unknown-no-hash-highlight.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_lv5_lv11_unknown_no_hash { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="0.8"; 8 | c0 [label="{{||||||||||||||||}|Out}"]; 9 | c1 [label="{{|||||||||||||||||}|??|{||||||||||||||||}}",fontcolor=red,color=red,style=bold]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}"]; 17 | c10 [label="{{|}|+|{}}"]; 18 | c11 [label="{{|}|+|{}}"]; 19 | c12 [label="{{|}|+|{}}"]; 20 | c13 [label="{0|{}}"]; 21 | c29 [label="{{|}|+|{}}" color=red,style=bold]; 22 | c30 [label="{{|}|+|{}}"]; 23 | c31 [label="{{|}|+|{}}"]; 24 | c32 [label="{{|}|+|{}}"]; 25 | c33 [label="{0|{}}"]; 26 | c42 [label="{In|{|||||||||||||||}}"]; 27 | c1:Out0 -> c0:In0 []; 28 | c1:Out1 -> c0:In1 []; 29 | c1:Out2 -> c0:In2 []; 30 | c1:Out3 -> c0:In3 []; 31 | c1:Out4 -> c0:In4 []; 32 | c1:Out5 -> c0:In5 []; 33 | c1:Out6 -> c0:In6 []; 34 | c1:Out7 -> c0:In7 []; 35 | c1:Out8 -> c0:In8 []; 36 | c1:Out9 -> c0:In9 []; 37 | c1:Out10 -> c0:In10 []; 38 | c1:Out11 -> c0:In11 []; 39 | c1:Out12 -> c0:In12 []; 40 | c1:Out13 -> c0:In13 []; 41 | c1:Out14 -> c0:In14 []; 42 | c1:Out15 -> c0:In15 []; 43 | c1:Out16 -> c0:In16 []; 44 | c33:Out0 -> c1:In0 []; 45 | c42:Out0 -> c1:In1 []; 46 | c32:Out0 -> c1:In2 []; 47 | c31:Out0 -> c1:In3 []; 48 | c30:Out0 -> c1:In4 []; 49 | c29:Out0 -> c1:In5 [color=red,style=bold]; 50 | c13:Out0 -> c1:In6 []; 51 | c42:Out5 -> c1:In7 []; 52 | c12:Out0 -> c1:In8 []; 53 | c11:Out0 -> c1:In9 []; 54 | c10:Out0 -> c1:In10 []; 55 | c9:Out0 -> c1:In11 []; 56 | c8:Out0 -> c1:In12 []; 57 | c7:Out0 -> c1:In13 []; 58 | c6:Out0 -> c1:In14 []; 59 | c5:Out0 -> c1:In15 []; 60 | c4:Out0 -> c1:In16 []; 61 | c3:Out0 -> c1:In17 []; 62 | c4:Out0 -> c3:In0 []; 63 | c42:Out15 -> c3:In1 []; 64 | c5:Out0 -> c4:In0 []; 65 | c42:Out14 -> c4:In1 []; 66 | c6:Out0 -> c5:In0 []; 67 | c42:Out13 -> c5:In1 []; 68 | c7:Out0 -> c6:In0 []; 69 | c42:Out12 -> c6:In1 []; 70 | c8:Out0 -> c7:In0 []; 71 | c42:Out11 -> c7:In1 []; 72 | c9:Out0 -> c8:In0 []; 73 | c42:Out10 -> c8:In1 []; 74 | c10:Out0 -> c9:In0 []; 75 | c42:Out9 -> c9:In1 []; 76 | c11:Out0 -> c10:In0 []; 77 | c42:Out8 -> c10:In1 []; 78 | c12:Out0 -> c11:In0 []; 79 | c42:Out7 -> c11:In1 []; 80 | c42:Out5 -> c12:In0 []; 81 | c42:Out6 -> c12:In1 []; 82 | c30:Out0 -> c29:In0 []; 83 | c42:Out4 -> c29:In1 []; 84 | c31:Out0 -> c30:In0 []; 85 | c42:Out3 -> c30:In1 []; 86 | c32:Out0 -> c31:In0 []; 87 | c42:Out2 -> c31:In1 []; 88 | c42:Out0 -> c32:In0 []; 89 | c42:Out1 -> c32:In1 []; 90 | } 91 | 92 | // lsums-lv5-lv11-unknown-no-hash components: 14 +, 2 0, 1 ??, 17 total. Max depth: 11. 93 | -------------------------------------------------------------------------------- /Figures/circuits/lsumsp-lv4olv4.dot: -------------------------------------------------------------------------------- 1 | digraph lsumsp_lv4olv4 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.4"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}"]; 17 | c10 [label="{{|}|+|{}}"]; 18 | c11 [label="{{|}|+|{}}"]; 19 | c12 [label="{{|}|+|{}}"]; 20 | c13 [label="{{|}|+|{}}"]; 21 | c14 [label="{{|}|+|{}}"]; 22 | c15 [label="{{|}|+|{}}"]; 23 | c16 [label="{{|}|+|{}}"]; 24 | c17 [label="{{|}|+|{}}"]; 25 | c18 [label="{{|}|+|{}}"]; 26 | c19 [label="{{|}|+|{}}"]; 27 | c20 [label="{{|}|+|{}}"]; 28 | c21 [label="{{|}|+|{}}"]; 29 | c22 [label="{{|}|+|{}}"]; 30 | c23 [label="{{|}|+|{}}"]; 31 | c24 [label="{{|}|+|{}}"]; 32 | c26 [label="{In|{|||||||||||||||}}"]; 33 | c27 [label="{{|||||||||||||||}|Out}"]; 34 | c26:Out0 -> c1:In0 []; 35 | c26:Out1 -> c1:In1 []; 36 | c26:Out4 -> c2:In0 []; 37 | c26:Out5 -> c2:In1 []; 38 | c26:Out8 -> c3:In0 []; 39 | c26:Out9 -> c3:In1 []; 40 | c26:Out12 -> c4:In0 []; 41 | c26:Out13 -> c4:In1 []; 42 | c1:Out0 -> c5:In0 []; 43 | c26:Out2 -> c5:In1 []; 44 | c5:Out0 -> c6:In0 []; 45 | c26:Out3 -> c6:In1 []; 46 | c6:Out0 -> c7:In0 []; 47 | c26:Out4 -> c7:In1 []; 48 | c6:Out0 -> c8:In0 []; 49 | c2:Out0 -> c8:In1 []; 50 | c6:Out0 -> c9:In0 []; 51 | c11:Out0 -> c9:In1 []; 52 | c6:Out0 -> c10:In0 []; 53 | c12:Out0 -> c10:In1 []; 54 | c2:Out0 -> c11:In0 []; 55 | c26:Out6 -> c11:In1 []; 56 | c11:Out0 -> c12:In0 []; 57 | c26:Out7 -> c12:In1 []; 58 | c3:Out0 -> c13:In0 []; 59 | c26:Out10 -> c13:In1 []; 60 | c13:Out0 -> c14:In0 []; 61 | c26:Out11 -> c14:In1 []; 62 | c4:Out0 -> c15:In0 []; 63 | c26:Out14 -> c15:In1 []; 64 | c15:Out0 -> c16:In0 []; 65 | c26:Out15 -> c16:In1 []; 66 | c10:Out0 -> c17:In0 []; 67 | c26:Out8 -> c17:In1 []; 68 | c10:Out0 -> c18:In0 []; 69 | c3:Out0 -> c18:In1 []; 70 | c10:Out0 -> c19:In0 []; 71 | c13:Out0 -> c19:In1 []; 72 | c10:Out0 -> c20:In0 []; 73 | c14:Out0 -> c20:In1 []; 74 | c20:Out0 -> c21:In0 []; 75 | c26:Out12 -> c21:In1 []; 76 | c20:Out0 -> c22:In0 []; 77 | c4:Out0 -> c22:In1 []; 78 | c20:Out0 -> c23:In0 []; 79 | c15:Out0 -> c23:In1 []; 80 | c20:Out0 -> c24:In0 []; 81 | c16:Out0 -> c24:In1 []; 82 | c26:Out0 -> c27:In0 []; 83 | c1:Out0 -> c27:In1 []; 84 | c5:Out0 -> c27:In2 []; 85 | c6:Out0 -> c27:In3 []; 86 | c7:Out0 -> c27:In4 []; 87 | c8:Out0 -> c27:In5 []; 88 | c9:Out0 -> c27:In6 []; 89 | c10:Out0 -> c27:In7 []; 90 | c17:Out0 -> c27:In8 []; 91 | c18:Out0 -> c27:In9 []; 92 | c19:Out0 -> c27:In10 []; 93 | c20:Out0 -> c27:In11 []; 94 | c21:Out0 -> c27:In12 []; 95 | c22:Out0 -> c27:In13 []; 96 | c23:Out0 -> c27:In14 []; 97 | c24:Out0 -> c27:In15 []; 98 | } 99 | 100 | // lsumsp-lv4olv4 components: 24 +. Max depth: 6. 101 | -------------------------------------------------------------------------------- /Figures/circuits/lsumsp-lv5-5-6-l.dot: -------------------------------------------------------------------------------- 1 | digraph lsumsp_lv5_5_6_l { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.5"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}"]; 17 | c10 [label="{{|}|+|{}}"]; 18 | c11 [label="{{|}|+|{}}"]; 19 | c12 [label="{{|}|+|{}}"]; 20 | c13 [label="{{|}|+|{}}"]; 21 | c14 [label="{{|}|+|{}}"]; 22 | c15 [label="{{|}|+|{}}"]; 23 | c16 [label="{{|}|+|{}}"]; 24 | c17 [label="{{|}|+|{}}"]; 25 | c18 [label="{{|}|+|{}}"]; 26 | c19 [label="{{|}|+|{}}"]; 27 | c20 [label="{{|}|+|{}}"]; 28 | c21 [label="{{|}|+|{}}"]; 29 | c22 [label="{{|}|+|{}}"]; 30 | c23 [label="{{|}|+|{}}"]; 31 | c24 [label="{{|}|+|{}}"]; 32 | c26 [label="{In|{|||||||||||||||}}"]; 33 | c27 [label="{{|||||||||||||||}|Out}"]; 34 | c26:Out0 -> c1:In0 []; 35 | c26:Out1 -> c1:In1 []; 36 | c26:Out5 -> c2:In0 []; 37 | c26:Out6 -> c2:In1 []; 38 | c26:Out10 -> c3:In0 []; 39 | c26:Out11 -> c3:In1 []; 40 | c3:Out0 -> c4:In0 []; 41 | c26:Out12 -> c4:In1 []; 42 | c4:Out0 -> c5:In0 []; 43 | c26:Out13 -> c5:In1 []; 44 | c5:Out0 -> c6:In0 []; 45 | c26:Out14 -> c6:In1 []; 46 | c6:Out0 -> c7:In0 []; 47 | c26:Out15 -> c7:In1 []; 48 | c2:Out0 -> c8:In0 []; 49 | c26:Out7 -> c8:In1 []; 50 | c8:Out0 -> c9:In0 []; 51 | c26:Out8 -> c9:In1 []; 52 | c9:Out0 -> c10:In0 []; 53 | c26:Out9 -> c10:In1 []; 54 | c1:Out0 -> c11:In0 []; 55 | c26:Out2 -> c11:In1 []; 56 | c11:Out0 -> c12:In0 []; 57 | c26:Out3 -> c12:In1 []; 58 | c12:Out0 -> c13:In0 []; 59 | c26:Out4 -> c13:In1 []; 60 | c13:Out0 -> c14:In0 []; 61 | c26:Out5 -> c14:In1 []; 62 | c13:Out0 -> c15:In0 []; 63 | c2:Out0 -> c15:In1 []; 64 | c13:Out0 -> c16:In0 []; 65 | c8:Out0 -> c16:In1 []; 66 | c13:Out0 -> c17:In0 []; 67 | c9:Out0 -> c17:In1 []; 68 | c13:Out0 -> c18:In0 []; 69 | c10:Out0 -> c18:In1 []; 70 | c18:Out0 -> c19:In0 []; 71 | c26:Out10 -> c19:In1 []; 72 | c18:Out0 -> c20:In0 []; 73 | c3:Out0 -> c20:In1 []; 74 | c18:Out0 -> c21:In0 []; 75 | c4:Out0 -> c21:In1 []; 76 | c18:Out0 -> c22:In0 []; 77 | c5:Out0 -> c22:In1 []; 78 | c18:Out0 -> c23:In0 []; 79 | c6:Out0 -> c23:In1 []; 80 | c18:Out0 -> c24:In0 []; 81 | c7:Out0 -> c24:In1 []; 82 | c26:Out0 -> c27:In0 []; 83 | c1:Out0 -> c27:In1 []; 84 | c11:Out0 -> c27:In2 []; 85 | c12:Out0 -> c27:In3 []; 86 | c13:Out0 -> c27:In4 []; 87 | c14:Out0 -> c27:In5 []; 88 | c15:Out0 -> c27:In6 []; 89 | c16:Out0 -> c27:In7 []; 90 | c17:Out0 -> c27:In8 []; 91 | c18:Out0 -> c27:In9 []; 92 | c19:Out0 -> c27:In10 []; 93 | c20:Out0 -> c27:In11 []; 94 | c21:Out0 -> c27:In12 []; 95 | c22:Out0 -> c27:In13 []; 96 | c23:Out0 -> c27:In14 []; 97 | c24:Out0 -> c27:In15 []; 98 | } 99 | 100 | // lsumsp-lv5-5-6-l components: 24 +. Max depth: 6. 101 | -------------------------------------------------------------------------------- /Figures/circuits/lsumsp-rv8.dot: -------------------------------------------------------------------------------- 1 | digraph lsumsp_rv8 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="3.0"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}"]; 17 | c10 [label="{{|}|+|{}}"]; 18 | c11 [label="{{|}|+|{}}"]; 19 | c12 [label="{{|}|+|{}}"]; 20 | c13 [label="{{|}|+|{}}"]; 21 | c14 [label="{{|}|+|{}}"]; 22 | c15 [label="{{|}|+|{}}"]; 23 | c16 [label="{{|}|+|{}}"]; 24 | c17 [label="{{|}|+|{}}"]; 25 | c18 [label="{{|}|+|{}}"]; 26 | c19 [label="{{|}|+|{}}"]; 27 | c20 [label="{{|}|+|{}}"]; 28 | c21 [label="{{|}|+|{}}"]; 29 | c22 [label="{{|}|+|{}}"]; 30 | c23 [label="{{|}|+|{}}"]; 31 | c24 [label="{{|}|+|{}}"]; 32 | c25 [label="{{|}|+|{}}"]; 33 | c26 [label="{{|}|+|{}}"]; 34 | c27 [label="{{|}|+|{}}"]; 35 | c28 [label="{{|}|+|{}}"]; 36 | c30 [label="{In|{|||||||}}"]; 37 | c31 [label="{{|||||||}|Out}"]; 38 | c30:Out0 -> c1:In0 []; 39 | c30:Out1 -> c1:In1 []; 40 | c30:Out0 -> c2:In0 []; 41 | c8:Out0 -> c2:In1 []; 42 | c30:Out0 -> c3:In0 []; 43 | c9:Out0 -> c3:In1 []; 44 | c30:Out0 -> c4:In0 []; 45 | c10:Out0 -> c4:In1 []; 46 | c30:Out0 -> c5:In0 []; 47 | c11:Out0 -> c5:In1 []; 48 | c30:Out0 -> c6:In0 []; 49 | c12:Out0 -> c6:In1 []; 50 | c30:Out0 -> c7:In0 []; 51 | c13:Out0 -> c7:In1 []; 52 | c30:Out1 -> c8:In0 []; 53 | c30:Out2 -> c8:In1 []; 54 | c30:Out1 -> c9:In0 []; 55 | c14:Out0 -> c9:In1 []; 56 | c30:Out1 -> c10:In0 []; 57 | c15:Out0 -> c10:In1 []; 58 | c30:Out1 -> c11:In0 []; 59 | c16:Out0 -> c11:In1 []; 60 | c30:Out1 -> c12:In0 []; 61 | c17:Out0 -> c12:In1 []; 62 | c30:Out1 -> c13:In0 []; 63 | c18:Out0 -> c13:In1 []; 64 | c30:Out2 -> c14:In0 []; 65 | c30:Out3 -> c14:In1 []; 66 | c30:Out2 -> c15:In0 []; 67 | c19:Out0 -> c15:In1 []; 68 | c30:Out2 -> c16:In0 []; 69 | c20:Out0 -> c16:In1 []; 70 | c30:Out2 -> c17:In0 []; 71 | c21:Out0 -> c17:In1 []; 72 | c30:Out2 -> c18:In0 []; 73 | c22:Out0 -> c18:In1 []; 74 | c30:Out3 -> c19:In0 []; 75 | c30:Out4 -> c19:In1 []; 76 | c30:Out3 -> c20:In0 []; 77 | c23:Out0 -> c20:In1 []; 78 | c30:Out3 -> c21:In0 []; 79 | c24:Out0 -> c21:In1 []; 80 | c30:Out3 -> c22:In0 []; 81 | c25:Out0 -> c22:In1 []; 82 | c30:Out4 -> c23:In0 []; 83 | c30:Out5 -> c23:In1 []; 84 | c30:Out4 -> c24:In0 []; 85 | c26:Out0 -> c24:In1 []; 86 | c30:Out4 -> c25:In0 []; 87 | c27:Out0 -> c25:In1 []; 88 | c30:Out5 -> c26:In0 []; 89 | c30:Out6 -> c26:In1 []; 90 | c30:Out5 -> c27:In0 []; 91 | c28:Out0 -> c27:In1 []; 92 | c30:Out6 -> c28:In0 []; 93 | c30:Out7 -> c28:In1 []; 94 | c30:Out0 -> c31:In0 []; 95 | c1:Out0 -> c31:In1 []; 96 | c2:Out0 -> c31:In2 []; 97 | c3:Out0 -> c31:In3 []; 98 | c4:Out0 -> c31:In4 []; 99 | c5:Out0 -> c31:In5 []; 100 | c6:Out0 -> c31:In6 []; 101 | c7:Out0 -> c31:In7 []; 102 | } 103 | 104 | // lsumsp-rv8 components: 28 +. Max depth: 7. 105 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-lpow-4-2.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_lpow_4_2 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.4"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}"]; 17 | c10 [label="{{|}|+|{}}"]; 18 | c11 [label="{{|}|+|{}}"]; 19 | c12 [label="{{|}|+|{}}"]; 20 | c13 [label="{{|}|+|{}}"]; 21 | c14 [label="{{|}|+|{}}"]; 22 | c15 [label="{{|}|+|{}}"]; 23 | c16 [label="{{|}|+|{}}"]; 24 | c17 [label="{{|}|+|{}}"]; 25 | c18 [label="{{|}|+|{}}"]; 26 | c19 [label="{{|}|+|{}}"]; 27 | c20 [label="{{|}|+|{}}"]; 28 | c21 [label="{{|}|+|{}}"]; 29 | c22 [label="{{|}|+|{}}"]; 30 | c23 [label="{{|}|+|{}}"]; 31 | c24 [label="{{|}|+|{}}"]; 32 | c25 [label="{0|{}}"]; 33 | c26 [label="{In|{|||||||||||||||}}"]; 34 | c27 [label="{{||||||||||||||||}|Out}"]; 35 | c26:Out0 -> c1:In0 []; 36 | c26:Out1 -> c1:In1 []; 37 | c26:Out4 -> c2:In0 []; 38 | c26:Out5 -> c2:In1 []; 39 | c26:Out8 -> c3:In0 []; 40 | c26:Out9 -> c3:In1 []; 41 | c26:Out12 -> c4:In0 []; 42 | c26:Out13 -> c4:In1 []; 43 | c1:Out0 -> c5:In0 []; 44 | c26:Out2 -> c5:In1 []; 45 | c5:Out0 -> c6:In0 []; 46 | c26:Out3 -> c6:In1 []; 47 | c6:Out0 -> c7:In0 []; 48 | c26:Out4 -> c7:In1 []; 49 | c6:Out0 -> c8:In0 []; 50 | c2:Out0 -> c8:In1 []; 51 | c6:Out0 -> c9:In0 []; 52 | c11:Out0 -> c9:In1 []; 53 | c6:Out0 -> c10:In0 []; 54 | c12:Out0 -> c10:In1 []; 55 | c2:Out0 -> c11:In0 []; 56 | c26:Out6 -> c11:In1 []; 57 | c11:Out0 -> c12:In0 []; 58 | c26:Out7 -> c12:In1 []; 59 | c3:Out0 -> c13:In0 []; 60 | c26:Out10 -> c13:In1 []; 61 | c13:Out0 -> c14:In0 []; 62 | c26:Out11 -> c14:In1 []; 63 | c4:Out0 -> c15:In0 []; 64 | c26:Out14 -> c15:In1 []; 65 | c15:Out0 -> c16:In0 []; 66 | c26:Out15 -> c16:In1 []; 67 | c10:Out0 -> c17:In0 []; 68 | c26:Out8 -> c17:In1 []; 69 | c10:Out0 -> c18:In0 []; 70 | c3:Out0 -> c18:In1 []; 71 | c10:Out0 -> c19:In0 []; 72 | c13:Out0 -> c19:In1 []; 73 | c10:Out0 -> c20:In0 []; 74 | c14:Out0 -> c20:In1 []; 75 | c20:Out0 -> c21:In0 []; 76 | c26:Out12 -> c21:In1 []; 77 | c20:Out0 -> c22:In0 []; 78 | c4:Out0 -> c22:In1 []; 79 | c20:Out0 -> c23:In0 []; 80 | c15:Out0 -> c23:In1 []; 81 | c20:Out0 -> c24:In0 []; 82 | c16:Out0 -> c24:In1 []; 83 | c25:Out0 -> c27:In0 []; 84 | c26:Out0 -> c27:In1 []; 85 | c1:Out0 -> c27:In2 []; 86 | c5:Out0 -> c27:In3 []; 87 | c6:Out0 -> c27:In4 []; 88 | c7:Out0 -> c27:In5 []; 89 | c8:Out0 -> c27:In6 []; 90 | c9:Out0 -> c27:In7 []; 91 | c10:Out0 -> c27:In8 []; 92 | c17:Out0 -> c27:In9 []; 93 | c18:Out0 -> c27:In10 []; 94 | c19:Out0 -> c27:In11 []; 95 | c20:Out0 -> c27:In12 []; 96 | c21:Out0 -> c27:In13 []; 97 | c22:Out0 -> c27:In14 []; 98 | c23:Out0 -> c27:In15 []; 99 | c24:Out0 -> c27:In16 []; 100 | } 101 | 102 | // lsums-lpow-4-2 components: 24 +, 1 0, 25 total. Max depth: 6. 103 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-lv4olv4.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_lv4olv4 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.4"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}"]; 17 | c10 [label="{{|}|+|{}}"]; 18 | c11 [label="{{|}|+|{}}"]; 19 | c12 [label="{{|}|+|{}}"]; 20 | c13 [label="{{|}|+|{}}"]; 21 | c14 [label="{{|}|+|{}}"]; 22 | c15 [label="{{|}|+|{}}"]; 23 | c16 [label="{{|}|+|{}}"]; 24 | c17 [label="{{|}|+|{}}"]; 25 | c18 [label="{{|}|+|{}}"]; 26 | c19 [label="{{|}|+|{}}"]; 27 | c20 [label="{{|}|+|{}}"]; 28 | c21 [label="{{|}|+|{}}"]; 29 | c22 [label="{{|}|+|{}}"]; 30 | c23 [label="{{|}|+|{}}"]; 31 | c24 [label="{{|}|+|{}}"]; 32 | c25 [label="{0|{}}"]; 33 | c26 [label="{In|{|||||||||||||||}}"]; 34 | c27 [label="{{||||||||||||||||}|Out}"]; 35 | c26:Out0 -> c1:In0 []; 36 | c26:Out1 -> c1:In1 []; 37 | c26:Out4 -> c2:In0 []; 38 | c26:Out5 -> c2:In1 []; 39 | c26:Out8 -> c3:In0 []; 40 | c26:Out9 -> c3:In1 []; 41 | c26:Out12 -> c4:In0 []; 42 | c26:Out13 -> c4:In1 []; 43 | c1:Out0 -> c5:In0 []; 44 | c26:Out2 -> c5:In1 []; 45 | c5:Out0 -> c6:In0 []; 46 | c26:Out3 -> c6:In1 []; 47 | c6:Out0 -> c7:In0 []; 48 | c26:Out4 -> c7:In1 []; 49 | c6:Out0 -> c8:In0 []; 50 | c2:Out0 -> c8:In1 []; 51 | c6:Out0 -> c9:In0 []; 52 | c11:Out0 -> c9:In1 []; 53 | c6:Out0 -> c10:In0 []; 54 | c12:Out0 -> c10:In1 []; 55 | c2:Out0 -> c11:In0 []; 56 | c26:Out6 -> c11:In1 []; 57 | c11:Out0 -> c12:In0 []; 58 | c26:Out7 -> c12:In1 []; 59 | c3:Out0 -> c13:In0 []; 60 | c26:Out10 -> c13:In1 []; 61 | c13:Out0 -> c14:In0 []; 62 | c26:Out11 -> c14:In1 []; 63 | c4:Out0 -> c15:In0 []; 64 | c26:Out14 -> c15:In1 []; 65 | c15:Out0 -> c16:In0 []; 66 | c26:Out15 -> c16:In1 []; 67 | c10:Out0 -> c17:In0 []; 68 | c26:Out8 -> c17:In1 []; 69 | c10:Out0 -> c18:In0 []; 70 | c3:Out0 -> c18:In1 []; 71 | c10:Out0 -> c19:In0 []; 72 | c13:Out0 -> c19:In1 []; 73 | c10:Out0 -> c20:In0 []; 74 | c14:Out0 -> c20:In1 []; 75 | c20:Out0 -> c21:In0 []; 76 | c26:Out12 -> c21:In1 []; 77 | c20:Out0 -> c22:In0 []; 78 | c4:Out0 -> c22:In1 []; 79 | c20:Out0 -> c23:In0 []; 80 | c15:Out0 -> c23:In1 []; 81 | c20:Out0 -> c24:In0 []; 82 | c16:Out0 -> c24:In1 []; 83 | c25:Out0 -> c27:In0 []; 84 | c26:Out0 -> c27:In1 []; 85 | c1:Out0 -> c27:In2 []; 86 | c5:Out0 -> c27:In3 []; 87 | c6:Out0 -> c27:In4 []; 88 | c7:Out0 -> c27:In5 []; 89 | c8:Out0 -> c27:In6 []; 90 | c9:Out0 -> c27:In7 []; 91 | c10:Out0 -> c27:In8 []; 92 | c17:Out0 -> c27:In9 []; 93 | c18:Out0 -> c27:In10 []; 94 | c19:Out0 -> c27:In11 []; 95 | c20:Out0 -> c27:In12 []; 96 | c21:Out0 -> c27:In13 []; 97 | c22:Out0 -> c27:In14 []; 98 | c23:Out0 -> c27:In15 []; 99 | c24:Out0 -> c27:In16 []; 100 | } 101 | 102 | // lsums-lv4olv4 components: 24 +, 1 0, 25 total. Max depth: 6. 103 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-lv5-5-6-l.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_lv5_5_6_l { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.5"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}"]; 17 | c10 [label="{{|}|+|{}}"]; 18 | c11 [label="{{|}|+|{}}"]; 19 | c12 [label="{{|}|+|{}}"]; 20 | c13 [label="{{|}|+|{}}"]; 21 | c14 [label="{{|}|+|{}}"]; 22 | c15 [label="{{|}|+|{}}"]; 23 | c16 [label="{{|}|+|{}}"]; 24 | c17 [label="{{|}|+|{}}"]; 25 | c18 [label="{{|}|+|{}}"]; 26 | c19 [label="{{|}|+|{}}"]; 27 | c20 [label="{{|}|+|{}}"]; 28 | c21 [label="{{|}|+|{}}"]; 29 | c22 [label="{{|}|+|{}}"]; 30 | c23 [label="{{|}|+|{}}"]; 31 | c24 [label="{{|}|+|{}}"]; 32 | c25 [label="{0|{}}"]; 33 | c26 [label="{In|{|||||||||||||||}}"]; 34 | c27 [label="{{||||||||||||||||}|Out}"]; 35 | c26:Out0 -> c1:In0 []; 36 | c26:Out1 -> c1:In1 []; 37 | c26:Out5 -> c2:In0 []; 38 | c26:Out6 -> c2:In1 []; 39 | c26:Out10 -> c3:In0 []; 40 | c26:Out11 -> c3:In1 []; 41 | c3:Out0 -> c4:In0 []; 42 | c26:Out12 -> c4:In1 []; 43 | c4:Out0 -> c5:In0 []; 44 | c26:Out13 -> c5:In1 []; 45 | c5:Out0 -> c6:In0 []; 46 | c26:Out14 -> c6:In1 []; 47 | c6:Out0 -> c7:In0 []; 48 | c26:Out15 -> c7:In1 []; 49 | c2:Out0 -> c8:In0 []; 50 | c26:Out7 -> c8:In1 []; 51 | c8:Out0 -> c9:In0 []; 52 | c26:Out8 -> c9:In1 []; 53 | c9:Out0 -> c10:In0 []; 54 | c26:Out9 -> c10:In1 []; 55 | c1:Out0 -> c11:In0 []; 56 | c26:Out2 -> c11:In1 []; 57 | c11:Out0 -> c12:In0 []; 58 | c26:Out3 -> c12:In1 []; 59 | c12:Out0 -> c13:In0 []; 60 | c26:Out4 -> c13:In1 []; 61 | c13:Out0 -> c14:In0 []; 62 | c26:Out5 -> c14:In1 []; 63 | c13:Out0 -> c15:In0 []; 64 | c2:Out0 -> c15:In1 []; 65 | c13:Out0 -> c16:In0 []; 66 | c8:Out0 -> c16:In1 []; 67 | c13:Out0 -> c17:In0 []; 68 | c9:Out0 -> c17:In1 []; 69 | c13:Out0 -> c18:In0 []; 70 | c10:Out0 -> c18:In1 []; 71 | c18:Out0 -> c19:In0 []; 72 | c26:Out10 -> c19:In1 []; 73 | c18:Out0 -> c20:In0 []; 74 | c3:Out0 -> c20:In1 []; 75 | c18:Out0 -> c21:In0 []; 76 | c4:Out0 -> c21:In1 []; 77 | c18:Out0 -> c22:In0 []; 78 | c5:Out0 -> c22:In1 []; 79 | c18:Out0 -> c23:In0 []; 80 | c6:Out0 -> c23:In1 []; 81 | c18:Out0 -> c24:In0 []; 82 | c7:Out0 -> c24:In1 []; 83 | c25:Out0 -> c27:In0 []; 84 | c26:Out0 -> c27:In1 []; 85 | c1:Out0 -> c27:In2 []; 86 | c11:Out0 -> c27:In3 []; 87 | c12:Out0 -> c27:In4 []; 88 | c13:Out0 -> c27:In5 []; 89 | c14:Out0 -> c27:In6 []; 90 | c15:Out0 -> c27:In7 []; 91 | c16:Out0 -> c27:In8 []; 92 | c17:Out0 -> c27:In9 []; 93 | c18:Out0 -> c27:In10 []; 94 | c19:Out0 -> c27:In11 []; 95 | c20:Out0 -> c27:In12 []; 96 | c21:Out0 -> c27:In13 []; 97 | c22:Out0 -> c27:In14 []; 98 | c23:Out0 -> c27:In15 []; 99 | c24:Out0 -> c27:In16 []; 100 | } 101 | 102 | // lsums-lv5-5-6-l components: 24 +, 1 0, 25 total. Max depth: 6. 103 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-lb4.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_lb4 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.6"; 8 | c0 [label="{{|}|+|{}}"]; 9 | c1 [label="{{|}|+|{}}"]; 10 | c2 [label="{{|}|+|{}}"]; 11 | c3 [label="{{|}|+|{}}"]; 12 | c4 [label="{{|}|+|{}}"]; 13 | c5 [label="{{|}|+|{}}"]; 14 | c6 [label="{{|}|+|{}}"]; 15 | c7 [label="{{|}|+|{}}"]; 16 | c8 [label="{{|}|+|{}}"]; 17 | c9 [label="{{|}|+|{}}"]; 18 | c10 [label="{{|}|+|{}}"]; 19 | c11 [label="{{|}|+|{}}"]; 20 | c12 [label="{{|}|+|{}}"]; 21 | c13 [label="{{|}|+|{}}"]; 22 | c14 [label="{{|}|+|{}}"]; 23 | c15 [label="{{|}|+|{}}"]; 24 | c16 [label="{{|}|+|{}}"]; 25 | c17 [label="{{|}|+|{}}"]; 26 | c18 [label="{{|}|+|{}}"]; 27 | c19 [label="{{|}|+|{}}"]; 28 | c20 [label="{{|}|+|{}}"]; 29 | c21 [label="{{|}|+|{}}"]; 30 | c22 [label="{{|}|+|{}}"]; 31 | c23 [label="{{|}|+|{}}"]; 32 | c24 [label="{{|}|+|{}}"]; 33 | c25 [label="{{|}|+|{}}"]; 34 | c26 [label="{0|{}}"]; 35 | c27 [label="{In|{|||||||||||||||}}"]; 36 | c28 [label="{{||||||||||||||||}|Out}"]; 37 | c27:Out0 -> c0:In0; 38 | c27:Out1 -> c0:In1; 39 | c27:Out2 -> c1:In0; 40 | c27:Out3 -> c1:In1; 41 | c27:Out2 -> c2:In0; 42 | c0:Out0 -> c2:In1; 43 | c27:Out4 -> c3:In0; 44 | c27:Out5 -> c3:In1; 45 | c27:Out4 -> c4:In0; 46 | c15:Out0 -> c4:In1; 47 | c27:Out6 -> c5:In0; 48 | c27:Out7 -> c5:In1; 49 | c27:Out6 -> c6:In0; 50 | c17:Out0 -> c6:In1; 51 | c27:Out8 -> c7:In0; 52 | c27:Out9 -> c7:In1; 53 | c27:Out8 -> c8:In0; 54 | c22:Out0 -> c8:In1; 55 | c27:Out10 -> c9:In0; 56 | c27:Out11 -> c9:In1; 57 | c27:Out10 -> c10:In0; 58 | c19:Out0 -> c10:In1; 59 | c27:Out12 -> c11:In0; 60 | c27:Out13 -> c11:In1; 61 | c27:Out12 -> c12:In0; 62 | c24:Out0 -> c12:In1; 63 | c27:Out14 -> c13:In0; 64 | c27:Out15 -> c13:In1; 65 | c27:Out14 -> c14:In0; 66 | c21:Out0 -> c14:In1; 67 | c0:Out0 -> c15:In0; 68 | c1:Out0 -> c15:In1; 69 | c3:Out0 -> c16:In0; 70 | c5:Out0 -> c16:In1; 71 | c3:Out0 -> c17:In0; 72 | c15:Out0 -> c17:In1; 73 | c7:Out0 -> c18:In0; 74 | c9:Out0 -> c18:In1; 75 | c7:Out0 -> c19:In0; 76 | c22:Out0 -> c19:In1; 77 | c11:Out0 -> c20:In0; 78 | c13:Out0 -> c20:In1; 79 | c11:Out0 -> c21:In0; 80 | c24:Out0 -> c21:In1; 81 | c15:Out0 -> c22:In0; 82 | c16:Out0 -> c22:In1; 83 | c18:Out0 -> c23:In0; 84 | c20:Out0 -> c23:In1; 85 | c18:Out0 -> c24:In0; 86 | c22:Out0 -> c24:In1; 87 | c22:Out0 -> c25:In0; 88 | c23:Out0 -> c25:In1; 89 | c26:Out0 -> c28:In0; 90 | c27:Out0 -> c28:In1; 91 | c0:Out0 -> c28:In2; 92 | c2:Out0 -> c28:In3; 93 | c15:Out0 -> c28:In4; 94 | c4:Out0 -> c28:In5; 95 | c17:Out0 -> c28:In6; 96 | c6:Out0 -> c28:In7; 97 | c22:Out0 -> c28:In8; 98 | c8:Out0 -> c28:In9; 99 | c19:Out0 -> c28:In10; 100 | c10:Out0 -> c28:In11; 101 | c24:Out0 -> c28:In12; 102 | c12:Out0 -> c28:In13; 103 | c21:Out0 -> c28:In14; 104 | c14:Out0 -> c28:In15; 105 | c25:Out0 -> c28:In16; 106 | } 107 | 108 | // lsums-lb4 components: 26 +, 1 0, 27 total. Max depth: 6. 109 | -------------------------------------------------------------------------------- /Figures/circuits/lsumsp-lv5xlv11.dot: -------------------------------------------------------------------------------- 1 | digraph lsumsp_lv5xlv11 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.0"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}"]; 17 | c10 [label="{{|}|+|{}}"]; 18 | c11 [label="{{|}|+|{}}"]; 19 | c12 [label="{{|}|+|{}}"]; 20 | c13 [label="{{|}|+|{}}"]; 21 | c14 [label="{{|}|+|{}}"]; 22 | c15 [label="{{|}|+|{}}"]; 23 | c16 [label="{{|}|+|{}}"]; 24 | c17 [label="{{|}|+|{}}"]; 25 | c18 [label="{{|}|+|{}}"]; 26 | c19 [label="{{|}|+|{}}"]; 27 | c20 [label="{{|}|+|{}}"]; 28 | c21 [label="{{|}|+|{}}"]; 29 | c22 [label="{{|}|+|{}}"]; 30 | c23 [label="{{|}|+|{}}"]; 31 | c24 [label="{{|}|+|{}}"]; 32 | c25 [label="{{|}|+|{}}"]; 33 | c27 [label="{In|{|||||||||||||||}}"]; 34 | c28 [label="{{|||||||||||||||}|Out}"]; 35 | c27:Out0 -> c1:In0 []; 36 | c27:Out1 -> c1:In1 []; 37 | c27:Out5 -> c2:In0 []; 38 | c27:Out6 -> c2:In1 []; 39 | c2:Out0 -> c3:In0 []; 40 | c27:Out7 -> c3:In1 []; 41 | c3:Out0 -> c4:In0 []; 42 | c27:Out8 -> c4:In1 []; 43 | c4:Out0 -> c5:In0 []; 44 | c27:Out9 -> c5:In1 []; 45 | c5:Out0 -> c6:In0 []; 46 | c27:Out10 -> c6:In1 []; 47 | c6:Out0 -> c7:In0 []; 48 | c27:Out11 -> c7:In1 []; 49 | c7:Out0 -> c8:In0 []; 50 | c27:Out12 -> c8:In1 []; 51 | c8:Out0 -> c9:In0 []; 52 | c27:Out13 -> c9:In1 []; 53 | c9:Out0 -> c10:In0 []; 54 | c27:Out14 -> c10:In1 []; 55 | c10:Out0 -> c11:In0 []; 56 | c27:Out15 -> c11:In1 []; 57 | c1:Out0 -> c12:In0 []; 58 | c27:Out2 -> c12:In1 []; 59 | c12:Out0 -> c13:In0 []; 60 | c27:Out3 -> c13:In1 []; 61 | c13:Out0 -> c14:In0 []; 62 | c27:Out4 -> c14:In1 []; 63 | c14:Out0 -> c15:In0 []; 64 | c27:Out5 -> c15:In1 []; 65 | c14:Out0 -> c16:In0 []; 66 | c2:Out0 -> c16:In1 []; 67 | c14:Out0 -> c17:In0 []; 68 | c3:Out0 -> c17:In1 []; 69 | c14:Out0 -> c18:In0 []; 70 | c4:Out0 -> c18:In1 []; 71 | c14:Out0 -> c19:In0 []; 72 | c5:Out0 -> c19:In1 []; 73 | c14:Out0 -> c20:In0 []; 74 | c6:Out0 -> c20:In1 []; 75 | c14:Out0 -> c21:In0 []; 76 | c7:Out0 -> c21:In1 []; 77 | c14:Out0 -> c22:In0 []; 78 | c8:Out0 -> c22:In1 []; 79 | c14:Out0 -> c23:In0 []; 80 | c9:Out0 -> c23:In1 []; 81 | c14:Out0 -> c24:In0 []; 82 | c10:Out0 -> c24:In1 []; 83 | c14:Out0 -> c25:In0 []; 84 | c11:Out0 -> c25:In1 []; 85 | c27:Out0 -> c28:In0 []; 86 | c1:Out0 -> c28:In1 []; 87 | c12:Out0 -> c28:In2 []; 88 | c13:Out0 -> c28:In3 []; 89 | c14:Out0 -> c28:In4 []; 90 | c15:Out0 -> c28:In5 []; 91 | c16:Out0 -> c28:In6 []; 92 | c17:Out0 -> c28:In7 []; 93 | c18:Out0 -> c28:In8 []; 94 | c19:Out0 -> c28:In9 []; 95 | c20:Out0 -> c28:In10 []; 96 | c21:Out0 -> c28:In11 []; 97 | c22:Out0 -> c28:In12 []; 98 | c23:Out0 -> c28:In13 []; 99 | c24:Out0 -> c28:In14 []; 100 | c25:Out0 -> c28:In15 []; 101 | } 102 | 103 | // lsumsp-lv5xlv11 components: 25 +. Max depth: 11. 104 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-rv8.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_rv8 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="2.4"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}"]; 17 | c10 [label="{{|}|+|{}}"]; 18 | c11 [label="{{|}|+|{}}"]; 19 | c12 [label="{{|}|+|{}}"]; 20 | c13 [label="{{|}|+|{}}"]; 21 | c14 [label="{{|}|+|{}}"]; 22 | c15 [label="{{|}|+|{}}"]; 23 | c16 [label="{{|}|+|{}}"]; 24 | c17 [label="{{|}|+|{}}"]; 25 | c18 [label="{{|}|+|{}}"]; 26 | c19 [label="{{|}|+|{}}"]; 27 | c20 [label="{{|}|+|{}}"]; 28 | c21 [label="{{|}|+|{}}"]; 29 | c22 [label="{{|}|+|{}}"]; 30 | c23 [label="{{|}|+|{}}"]; 31 | c24 [label="{{|}|+|{}}"]; 32 | c25 [label="{{|}|+|{}}"]; 33 | c26 [label="{{|}|+|{}}"]; 34 | c27 [label="{{|}|+|{}}"]; 35 | c28 [label="{{|}|+|{}}"]; 36 | c29 [label="{0|{}}"]; 37 | c30 [label="{In|{|||||||}}"]; 38 | c31 [label="{{||||||||}|Out}"]; 39 | c30:Out0 -> c1:In0 []; 40 | c30:Out1 -> c1:In1 []; 41 | c30:Out0 -> c2:In0 []; 42 | c8:Out0 -> c2:In1 []; 43 | c30:Out0 -> c3:In0 []; 44 | c9:Out0 -> c3:In1 []; 45 | c30:Out0 -> c4:In0 []; 46 | c10:Out0 -> c4:In1 []; 47 | c30:Out0 -> c5:In0 []; 48 | c11:Out0 -> c5:In1 []; 49 | c30:Out0 -> c6:In0 []; 50 | c12:Out0 -> c6:In1 []; 51 | c30:Out0 -> c7:In0 []; 52 | c13:Out0 -> c7:In1 []; 53 | c30:Out1 -> c8:In0 []; 54 | c30:Out2 -> c8:In1 []; 55 | c30:Out1 -> c9:In0 []; 56 | c14:Out0 -> c9:In1 []; 57 | c30:Out1 -> c10:In0 []; 58 | c15:Out0 -> c10:In1 []; 59 | c30:Out1 -> c11:In0 []; 60 | c16:Out0 -> c11:In1 []; 61 | c30:Out1 -> c12:In0 []; 62 | c17:Out0 -> c12:In1 []; 63 | c30:Out1 -> c13:In0 []; 64 | c18:Out0 -> c13:In1 []; 65 | c30:Out2 -> c14:In0 []; 66 | c30:Out3 -> c14:In1 []; 67 | c30:Out2 -> c15:In0 []; 68 | c19:Out0 -> c15:In1 []; 69 | c30:Out2 -> c16:In0 []; 70 | c20:Out0 -> c16:In1 []; 71 | c30:Out2 -> c17:In0 []; 72 | c21:Out0 -> c17:In1 []; 73 | c30:Out2 -> c18:In0 []; 74 | c22:Out0 -> c18:In1 []; 75 | c30:Out3 -> c19:In0 []; 76 | c30:Out4 -> c19:In1 []; 77 | c30:Out3 -> c20:In0 []; 78 | c23:Out0 -> c20:In1 []; 79 | c30:Out3 -> c21:In0 []; 80 | c24:Out0 -> c21:In1 []; 81 | c30:Out3 -> c22:In0 []; 82 | c25:Out0 -> c22:In1 []; 83 | c30:Out4 -> c23:In0 []; 84 | c30:Out5 -> c23:In1 []; 85 | c30:Out4 -> c24:In0 []; 86 | c26:Out0 -> c24:In1 []; 87 | c30:Out4 -> c25:In0 []; 88 | c27:Out0 -> c25:In1 []; 89 | c30:Out5 -> c26:In0 []; 90 | c30:Out6 -> c26:In1 []; 91 | c30:Out5 -> c27:In0 []; 92 | c28:Out0 -> c27:In1 []; 93 | c30:Out6 -> c28:In0 []; 94 | c30:Out7 -> c28:In1 []; 95 | c29:Out0 -> c31:In0 []; 96 | c30:Out0 -> c31:In1 []; 97 | c1:Out0 -> c31:In2 []; 98 | c2:Out0 -> c31:In3 []; 99 | c3:Out0 -> c31:In4 []; 100 | c4:Out0 -> c31:In5 []; 101 | c5:Out0 -> c31:In6 []; 102 | c6:Out0 -> c31:In7 []; 103 | c7:Out0 -> c31:In8 []; 104 | } 105 | 106 | // lsums-rv8 components: 28 +, 1 0, 29 total. Max depth: 7. 107 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-lv5xlv11.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_lv5xlv11 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.0"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}"]; 17 | c10 [label="{{|}|+|{}}"]; 18 | c11 [label="{{|}|+|{}}"]; 19 | c12 [label="{{|}|+|{}}"]; 20 | c13 [label="{{|}|+|{}}"]; 21 | c14 [label="{{|}|+|{}}"]; 22 | c15 [label="{{|}|+|{}}"]; 23 | c16 [label="{{|}|+|{}}"]; 24 | c17 [label="{{|}|+|{}}"]; 25 | c18 [label="{{|}|+|{}}"]; 26 | c19 [label="{{|}|+|{}}"]; 27 | c20 [label="{{|}|+|{}}"]; 28 | c21 [label="{{|}|+|{}}"]; 29 | c22 [label="{{|}|+|{}}"]; 30 | c23 [label="{{|}|+|{}}"]; 31 | c24 [label="{{|}|+|{}}"]; 32 | c25 [label="{{|}|+|{}}"]; 33 | c26 [label="{0|{}}"]; 34 | c27 [label="{In|{|||||||||||||||}}"]; 35 | c28 [label="{{||||||||||||||||}|Out}"]; 36 | c27:Out0 -> c1:In0 []; 37 | c27:Out1 -> c1:In1 []; 38 | c27:Out5 -> c2:In0 []; 39 | c27:Out6 -> c2:In1 []; 40 | c2:Out0 -> c3:In0 []; 41 | c27:Out7 -> c3:In1 []; 42 | c3:Out0 -> c4:In0 []; 43 | c27:Out8 -> c4:In1 []; 44 | c4:Out0 -> c5:In0 []; 45 | c27:Out9 -> c5:In1 []; 46 | c5:Out0 -> c6:In0 []; 47 | c27:Out10 -> c6:In1 []; 48 | c6:Out0 -> c7:In0 []; 49 | c27:Out11 -> c7:In1 []; 50 | c7:Out0 -> c8:In0 []; 51 | c27:Out12 -> c8:In1 []; 52 | c8:Out0 -> c9:In0 []; 53 | c27:Out13 -> c9:In1 []; 54 | c9:Out0 -> c10:In0 []; 55 | c27:Out14 -> c10:In1 []; 56 | c10:Out0 -> c11:In0 []; 57 | c27:Out15 -> c11:In1 []; 58 | c1:Out0 -> c12:In0 []; 59 | c27:Out2 -> c12:In1 []; 60 | c12:Out0 -> c13:In0 []; 61 | c27:Out3 -> c13:In1 []; 62 | c13:Out0 -> c14:In0 []; 63 | c27:Out4 -> c14:In1 []; 64 | c14:Out0 -> c15:In0 []; 65 | c27:Out5 -> c15:In1 []; 66 | c14:Out0 -> c16:In0 []; 67 | c2:Out0 -> c16:In1 []; 68 | c14:Out0 -> c17:In0 []; 69 | c3:Out0 -> c17:In1 []; 70 | c14:Out0 -> c18:In0 []; 71 | c4:Out0 -> c18:In1 []; 72 | c14:Out0 -> c19:In0 []; 73 | c5:Out0 -> c19:In1 []; 74 | c14:Out0 -> c20:In0 []; 75 | c6:Out0 -> c20:In1 []; 76 | c14:Out0 -> c21:In0 []; 77 | c7:Out0 -> c21:In1 []; 78 | c14:Out0 -> c22:In0 []; 79 | c8:Out0 -> c22:In1 []; 80 | c14:Out0 -> c23:In0 []; 81 | c9:Out0 -> c23:In1 []; 82 | c14:Out0 -> c24:In0 []; 83 | c10:Out0 -> c24:In1 []; 84 | c14:Out0 -> c25:In0 []; 85 | c11:Out0 -> c25:In1 []; 86 | c26:Out0 -> c28:In0 []; 87 | c27:Out0 -> c28:In1 []; 88 | c1:Out0 -> c28:In2 []; 89 | c12:Out0 -> c28:In3 []; 90 | c13:Out0 -> c28:In4 []; 91 | c14:Out0 -> c28:In5 []; 92 | c15:Out0 -> c28:In6 []; 93 | c16:Out0 -> c28:In7 []; 94 | c17:Out0 -> c28:In8 []; 95 | c18:Out0 -> c28:In9 []; 96 | c19:Out0 -> c28:In10 []; 97 | c20:Out0 -> c28:In11 []; 98 | c21:Out0 -> c28:In12 []; 99 | c22:Out0 -> c28:In13 []; 100 | c23:Out0 -> c28:In14 []; 101 | c24:Out0 -> c28:In15 []; 102 | c25:Out0 -> c28:In16 []; 103 | } 104 | 105 | // lsums-lv5xlv11 components: 25 +, 1 0, 26 total. Max depth: 11. 106 | -------------------------------------------------------------------------------- /Figures/circuits/lsumsp-lb4.dot: -------------------------------------------------------------------------------- 1 | digraph lsumsp_lb4 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.5"; 8 | c0 [label="{{|}|+|{}}"]; 9 | c1 [label="{{|}|+|{}}"]; 10 | c2 [label="{{|}|+|{}}"]; 11 | c3 [label="{{|}|+|{}}"]; 12 | c4 [label="{{|}|+|{}}"]; 13 | c5 [label="{{|}|+|{}}"]; 14 | c6 [label="{{|}|+|{}}"]; 15 | c7 [label="{{|}|+|{}}"]; 16 | c8 [label="{{|}|+|{}}"]; 17 | c9 [label="{{|}|+|{}}"]; 18 | c10 [label="{{|}|+|{}}"]; 19 | c11 [label="{{|}|+|{}}"]; 20 | c12 [label="{{|}|+|{}}"]; 21 | c13 [label="{{|}|+|{}}"]; 22 | c14 [label="{{|}|+|{}}"]; 23 | c15 [label="{{|}|+|{}}"]; 24 | c16 [label="{{|}|+|{}}"]; 25 | c17 [label="{{|}|+|{}}"]; 26 | c18 [label="{{|}|+|{}}"]; 27 | c19 [label="{{|}|+|{}}"]; 28 | c20 [label="{{|}|+|{}}"]; 29 | c21 [label="{{|}|+|{}}"]; 30 | c22 [label="{{|}|+|{}}"]; 31 | c23 [label="{{|}|+|{}}"]; 32 | c24 [label="{{|}|+|{}}"]; 33 | c25 [label="{{|}|+|{}}"]; 34 | c27 [label="{In|{|||||||||||||||}}"]; 35 | c28 [label="{{|||||||||||||||}|Out}"]; 36 | c27:Out0 -> c0:In0 []; 37 | c27:Out1 -> c0:In1 []; 38 | c27:Out2 -> c1:In0 []; 39 | c27:Out3 -> c1:In1 []; 40 | c27:Out4 -> c2:In0 []; 41 | c27:Out5 -> c2:In1 []; 42 | c27:Out6 -> c3:In0 []; 43 | c27:Out7 -> c3:In1 []; 44 | c27:Out8 -> c4:In0 []; 45 | c27:Out9 -> c4:In1 []; 46 | c27:Out10 -> c5:In0 []; 47 | c27:Out11 -> c5:In1 []; 48 | c27:Out12 -> c6:In0 []; 49 | c27:Out13 -> c6:In1 []; 50 | c27:Out14 -> c7:In0 []; 51 | c27:Out15 -> c7:In1 []; 52 | c0:Out0 -> c8:In0 []; 53 | c27:Out2 -> c8:In1 []; 54 | c0:Out0 -> c9:In0 []; 55 | c1:Out0 -> c9:In1 []; 56 | c2:Out0 -> c10:In0 []; 57 | c3:Out0 -> c10:In1 []; 58 | c4:Out0 -> c11:In0 []; 59 | c5:Out0 -> c11:In1 []; 60 | c6:Out0 -> c12:In0 []; 61 | c7:Out0 -> c12:In1 []; 62 | c9:Out0 -> c13:In0 []; 63 | c27:Out4 -> c13:In1 []; 64 | c9:Out0 -> c14:In0 []; 65 | c2:Out0 -> c14:In1 []; 66 | c9:Out0 -> c15:In0 []; 67 | c10:Out0 -> c15:In1 []; 68 | c11:Out0 -> c16:In0 []; 69 | c12:Out0 -> c16:In1 []; 70 | c15:Out0 -> c17:In0 []; 71 | c27:Out8 -> c17:In1 []; 72 | c15:Out0 -> c18:In0 []; 73 | c4:Out0 -> c18:In1 []; 74 | c15:Out0 -> c19:In0 []; 75 | c11:Out0 -> c19:In1 []; 76 | c15:Out0 -> c20:In0 []; 77 | c16:Out0 -> c20:In1 []; 78 | c19:Out0 -> c21:In0 []; 79 | c27:Out12 -> c21:In1 []; 80 | c19:Out0 -> c22:In0 []; 81 | c6:Out0 -> c22:In1 []; 82 | c14:Out0 -> c23:In0 []; 83 | c27:Out6 -> c23:In1 []; 84 | c18:Out0 -> c24:In0 []; 85 | c27:Out10 -> c24:In1 []; 86 | c22:Out0 -> c25:In0 []; 87 | c27:Out14 -> c25:In1 []; 88 | c27:Out0 -> c28:In0 []; 89 | c0:Out0 -> c28:In1 []; 90 | c8:Out0 -> c28:In2 []; 91 | c9:Out0 -> c28:In3 []; 92 | c13:Out0 -> c28:In4 []; 93 | c14:Out0 -> c28:In5 []; 94 | c23:Out0 -> c28:In6 []; 95 | c15:Out0 -> c28:In7 []; 96 | c17:Out0 -> c28:In8 []; 97 | c18:Out0 -> c28:In9 []; 98 | c24:Out0 -> c28:In10 []; 99 | c19:Out0 -> c28:In11 []; 100 | c21:Out0 -> c28:In12 []; 101 | c22:Out0 -> c28:In13 []; 102 | c25:Out0 -> c28:In14 []; 103 | c20:Out0 -> c28:In15 []; 104 | } 105 | 106 | // lsumsp-lb4 components: 26 +. Max depth: 6. 107 | -------------------------------------------------------------------------------- /mine.fmt: -------------------------------------------------------------------------------- 1 | %% Misc lhs2TeX directives 2 | 3 | %format family = "\mathbf{family}" 4 | 5 | %format <$> = "\mathbin{<\!\!\!\$\!\!\!>}" 6 | 7 | %% optional <$> spelling, to avoid $ confusing emacs latex-mode. 8 | %format <#> = <$> 9 | 10 | % Got from Andres L: 11 | \newcommand{\calculationcomments}{% 12 | \let\onelinecomment=\onelinecommentchars 13 | \def\commentbegin{\quad\{ }% 14 | \def\commentend{\}}% 15 | } 16 | \calculationcomments 17 | 18 | %format NOTHING = "{}" 19 | %% hack: add missing space, e.g., before "{" in data type decl 20 | %format SPC = "\, {}" 21 | %format SPACE = "\ \ {}" 22 | %format NOP = "{}" 23 | %% %format NOP = "{} \!\!" 24 | %format PAUSE = "\pause" 25 | 26 | %% %format <> = "\mathbin{\Diamond}" 27 | 28 | %format N0 = 0 29 | %format N1 = 1 30 | %format N2 = 2 31 | %format N3 = 3 32 | %format N4 = 4 33 | %format N5 = 5 34 | %format N6 = 6 35 | %format N7 = 7 36 | %format N8 = 8 37 | %format N9 = 9 38 | %format N0 = 0 39 | %format N11 = 11 40 | %format N12 = 12 41 | %format N13 = 13 42 | %format N14 = 14 43 | %format N15 = 15 44 | %format N16 = 16 45 | 46 | %% %format VecTy = "\Varid{Vec}" 47 | %% %format RBinTy = "\Varid{RBin}" 48 | %% %format LBinTy = "\Varid{\hspace{0.25ex}LBin}" 49 | 50 | %% %format Vec (n) = VecTy"_{"n"}" 51 | %% %format RBin (n) = RBinTy"_{"n"}" 52 | %% %format LBin (n) = LBinTy"_{"n"}" 53 | 54 | %% Why not just ... = Vec "_{"n"}", etc? 55 | 56 | %% %format Vec (n) = Vec"_{"n"}" 57 | %% %format LVec (n) = LVec"_{"n"}" 58 | %% %format RVec (n) = RVec"_{"n"}" 59 | %% %format RBin (n) = RBin"_{"n"}" 60 | %% %format LBin (n) = LBin"_{"n"}" 61 | 62 | %% %% Otherwise "type family Vec n" shows as "type family Vec. n". 63 | %% %format Vec_n = Vec"_n" 64 | %% %format LVec_n = LVec"_n" 65 | %% %format RVec_n = RVec"_n" 66 | %format Vec_n = Vec "\;"n 67 | %format LVec_n = LVec "\;"n 68 | %format RVec_n = RVec "\;"n 69 | 70 | %format V1 71 | %format U1 72 | %format K1 73 | %format Par1 74 | 75 | %format L1 76 | %format R1 77 | %format Comp1 78 | 79 | %format unK1 80 | %format unPar1 81 | %format unComp1 82 | 83 | %format And1 84 | %format unAnd1 85 | %format firstAnd1 86 | %format unzipAnd1 87 | 88 | %format :*: = " \pmb{\times} " 89 | %format :+: = " \pmb{+} " 90 | %format :.: = " \pmb{\circ} " 91 | 92 | %format firstAnd1 93 | 94 | %format :# = "\mathbin{:\!\!\#}" 95 | 96 | %format Pair = "\Pair" 97 | 98 | %format @ = "\,\mathord{@}" 99 | 100 | %format Generic1 101 | %format Rep1 102 | %format to1 103 | %format from1 104 | 105 | 106 | %%%%%%%%%%%% 107 | 108 | %format Unit = " \mathbf{1} " 109 | %format :* = " \times " 110 | %format :+ = " + " 111 | 112 | %% %format `mappend` = " \mathbin{\oplus} " 113 | %% %format mempty = " \emptyset " 114 | 115 | %format <> = " \mathbin{\Diamond} " 116 | %format `mappend` = " \mathbin{\Diamond} " 117 | %format mempty = " \varepsilon " 118 | 119 | % \renewcommand{\onelinecomment}{\it} 120 | 121 | % %format :> = "\mathbin{:\!>}" 122 | %format :> = "\mathbin{\rhd}" 123 | 124 | %% %format adjustl = bump 125 | %format =~ = " \simeq " 126 | 127 | %format <.> = "\cdot" 128 | 129 | %format `xor` = " \oplus " 130 | 131 | %format *** = "\mathbin{\times}" 132 | %% %format *** = "\symThree{*}" 133 | 134 | %format (LBin (n)) = "\overleftarrow{2^{"n"}}" 135 | %format (RBin (n)) = "\overrightarrow{2^{"n"}}" 136 | 137 | %% %format RBin = RPow "\;" Pair 138 | %% %format LBin = LPow "\;" Pair 139 | 140 | %format (LVec' (n)) = n 141 | %format (RVec' (n)) = n 142 | 143 | %format (Bush' (n)) = "2^{2^{"n"}}" 144 | 145 | %format (Size(n)) = "\Size{"n"}" 146 | %format * = "\times" 147 | %format ==> = "\therefore" 148 | 149 | %% %format STAR = * 150 | %format STAR = "\mathbin{*}" 151 | 152 | %% %format a ^ (n) = a"^{"n"}" 153 | 154 | %format pow a (n) = a"^{"n"}" 155 | 156 | %format log2 = log"_2" 157 | 158 | %format Work = W 159 | %format Depth = D 160 | -------------------------------------------------------------------------------- /Figures/circuits/dot-rb4.dot: -------------------------------------------------------------------------------- 1 | digraph dot_rb4 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="2.4"; 8 | c0 [label="{{|}|+|{}}"]; 9 | c1 [label="{{|}|+|{}}"]; 10 | c2 [label="{{|}|+|{}}"]; 11 | c3 [label="{{|}|+|{}}"]; 12 | c4 [label="{{|}|+|{}}"]; 13 | c5 [label="{{|}|+|{}}"]; 14 | c6 [label="{{|}|+|{}}"]; 15 | c7 [label="{{|}|+|{}}"]; 16 | c8 [label="{{|}|+|{}}"]; 17 | c9 [label="{{|}|+|{}}"]; 18 | c10 [label="{{|}|+|{}}"]; 19 | c11 [label="{{|}|+|{}}"]; 20 | c12 [label="{{|}|+|{}}"]; 21 | c13 [label="{{|}|+|{}}"]; 22 | c14 [label="{{|}|+|{}}"]; 23 | c15 [label="{In|{|||||||||||||||||||||||||||||||}}"]; 24 | c16 [label="{{}|Out}"]; 25 | c17 [label="{{|}|\×|{}}"]; 26 | c18 [label="{{|}|\×|{}}"]; 27 | c19 [label="{{|}|\×|{}}"]; 28 | c20 [label="{{|}|\×|{}}"]; 29 | c21 [label="{{|}|\×|{}}"]; 30 | c22 [label="{{|}|\×|{}}"]; 31 | c23 [label="{{|}|\×|{}}"]; 32 | c24 [label="{{|}|\×|{}}"]; 33 | c25 [label="{{|}|\×|{}}"]; 34 | c26 [label="{{|}|\×|{}}"]; 35 | c27 [label="{{|}|\×|{}}"]; 36 | c28 [label="{{|}|\×|{}}"]; 37 | c29 [label="{{|}|\×|{}}"]; 38 | c30 [label="{{|}|\×|{}}"]; 39 | c31 [label="{{|}|\×|{}}"]; 40 | c32 [label="{{|}|\×|{}}"]; 41 | c17:Out0 -> c0:In0 []; 42 | c18:Out0 -> c0:In1 []; 43 | c19:Out0 -> c1:In0 []; 44 | c20:Out0 -> c1:In1 []; 45 | c21:Out0 -> c2:In0 []; 46 | c22:Out0 -> c2:In1 []; 47 | c23:Out0 -> c3:In0 []; 48 | c24:Out0 -> c3:In1 []; 49 | c25:Out0 -> c4:In0 []; 50 | c26:Out0 -> c4:In1 []; 51 | c27:Out0 -> c5:In0 []; 52 | c28:Out0 -> c5:In1 []; 53 | c29:Out0 -> c6:In0 []; 54 | c30:Out0 -> c6:In1 []; 55 | c31:Out0 -> c7:In0 []; 56 | c32:Out0 -> c7:In1 []; 57 | c0:Out0 -> c8:In0 []; 58 | c1:Out0 -> c8:In1 []; 59 | c8:Out0 -> c9:In0 []; 60 | c10:Out0 -> c9:In1 []; 61 | c2:Out0 -> c10:In0 []; 62 | c3:Out0 -> c10:In1 []; 63 | c9:Out0 -> c11:In0 []; 64 | c13:Out0 -> c11:In1 []; 65 | c4:Out0 -> c12:In0 []; 66 | c5:Out0 -> c12:In1 []; 67 | c12:Out0 -> c13:In0 []; 68 | c14:Out0 -> c13:In1 []; 69 | c6:Out0 -> c14:In0 []; 70 | c7:Out0 -> c14:In1 []; 71 | c11:Out0 -> c16:In0 []; 72 | c15:Out0 -> c17:In0 []; 73 | c15:Out16 -> c17:In1 []; 74 | c15:Out1 -> c18:In0 []; 75 | c15:Out17 -> c18:In1 []; 76 | c15:Out2 -> c19:In0 []; 77 | c15:Out18 -> c19:In1 []; 78 | c15:Out3 -> c20:In0 []; 79 | c15:Out19 -> c20:In1 []; 80 | c15:Out4 -> c21:In0 []; 81 | c15:Out20 -> c21:In1 []; 82 | c15:Out5 -> c22:In0 []; 83 | c15:Out21 -> c22:In1 []; 84 | c15:Out6 -> c23:In0 []; 85 | c15:Out22 -> c23:In1 []; 86 | c15:Out7 -> c24:In0 []; 87 | c15:Out23 -> c24:In1 []; 88 | c15:Out8 -> c25:In0 []; 89 | c15:Out24 -> c25:In1 []; 90 | c15:Out9 -> c26:In0 []; 91 | c15:Out25 -> c26:In1 []; 92 | c15:Out10 -> c27:In0 []; 93 | c15:Out26 -> c27:In1 []; 94 | c15:Out11 -> c28:In0 []; 95 | c15:Out27 -> c28:In1 []; 96 | c15:Out12 -> c29:In0 []; 97 | c15:Out28 -> c29:In1 []; 98 | c15:Out13 -> c30:In0 []; 99 | c15:Out29 -> c30:In1 []; 100 | c15:Out14 -> c31:In0 []; 101 | c15:Out30 -> c31:In1 []; 102 | c15:Out15 -> c32:In0 []; 103 | c15:Out31 -> c32:In1 []; 104 | } 105 | 106 | // dot-rb4 components: 15 +, 16 ×, 31 total. Max depth: 5. 107 | -------------------------------------------------------------------------------- /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 | 9 | \nc\out[1]{} 10 | 11 | \nc\mynoteOut[2]{\mynote{#1}\out{#2}} 12 | 13 | % While working, use these defs 14 | %% \nc\mynote[1]{{\em [#1]}} 15 | %% \nc\mynotefoot[1]{\footnote{\mynote{#1}}} 16 | % But for the submission, use these 17 | \nc\mynote\out 18 | \nc\mynotefoot\out 19 | 20 | \nc\todo{\mynote{To do.}} 21 | 22 | \nc\figlabel[1]{\label{fig:#1}} 23 | \nc\figref[1]{Figure~\ref{fig:#1}} 24 | 25 | \nc\needcite{\mynote{ref}} 26 | 27 | % \nc{\Opid}[1]{\operatorname{#1}} 28 | \nc{\Opid}[1]{\Varid{#1}} 29 | \nc{\Varap}[1]{\Opid{#1}\,} 30 | \nc{\Varapp}[2]{\Varap{#1}{(#2)}} 31 | 32 | \nc\wpicture[2]{\includegraphics[width=#1]{#2}} 33 | 34 | \nc\wfig[2]{ 35 | \begin{center} 36 | \wpicture{#1}{#2} 37 | \end{center} 38 | } 39 | \nc\fig[1]{\wfig{4in}{#1}} 40 | 41 | \nc\usebg[1]{\usebackgroundtemplate{\wpicture{1.2\textwidth}{#1}}} 42 | 43 | \nc\framet[2]{\frame{\frametitle{#1}#2}} 44 | 45 | \nc\hidden[1]{} 46 | 47 | 48 | \newcommand{\Pair}{\Varid{Pair}} 49 | 50 | \newcommand{\stat}[6]{ 51 | #1 & #2 & #3 & #4 & #5 & #6 \\ \hline 52 | } 53 | \newcommand{\fftStats}[1]{ 54 | \begin{center} 55 | \begin{tabular}{|c|c|c|c|c|c|} 56 | \hline 57 | \stat{Type}{$+$}{$\times$}{$-$}{total}{max depth} \hline 58 | #1 59 | \hline 60 | \end{tabular} 61 | \end{center} 62 | } 63 | 64 | \nc{\subo}{_{\!\mathit{1}}} 65 | 66 | \nc\partframe[1]{\framet{}{\begin{center} \vspace{6ex} {\Huge \textcolor{partColor}{#1}} \end{center}}} 67 | 68 | \nc\symTwo[1]{\mathbin{#1\!\!\!#1}} 69 | \nc\symThree[1]{\mathbin{#1\!\!#1\!\!#1}} 70 | 71 | 72 | \usefonttheme{serif} 73 | \usepackage{framed} 74 | \usepackage{hyperref} 75 | \usepackage{color} 76 | 77 | \definecolor{linkColor}{rgb}{0,0.42,0.3} 78 | \definecolor{partColor}{rgb}{0,0,0.8} 79 | 80 | \hypersetup{colorlinks=true,urlcolor=linkColor} 81 | 82 | \usepackage{graphicx} 83 | \usepackage{color} 84 | \DeclareGraphicsExtensions{.pdf,.png,.jpg} 85 | 86 | \usepackage{geometry} 87 | % \usepackage[a4paper]{geometry} 88 | 89 | %% \usepackage{wasysym} 90 | \usepackage{mathabx} 91 | \usepackage{setspace} 92 | \usepackage{enumerate} 93 | \usepackage{tikzsymbols} 94 | % \usepackage{fancybox} 95 | \usepackage[many]{tcolorbox} 96 | 97 | \tcbset{enhanced,boxrule=0.5pt,colframe=black!50!blue,colback=white,boxsep=-2pt,drop fuzzy shadow} 98 | 99 | \usepackage[absolute,overlay]{textpos} % ,showboxes 100 | 101 | \TPGrid{364}{273} %% roughly page size in points 102 | 103 | \useinnertheme[shadow]{rounded} 104 | % \useoutertheme{default} 105 | \useoutertheme{shadow} 106 | \useoutertheme{infolines} 107 | % Suppress navigation arrows 108 | \setbeamertemplate{navigation symbols}{} 109 | 110 | \newcommand\sourced[1]{\href{#1}{\tiny (source)}} 111 | 112 | 113 | \definecolor{statColor}{rgb}{0,0.5,0} 114 | 115 | \newcommand{\stats}[2]{ 116 | {\small \textcolor{statColor}{work: #1, depth: #2}}} 117 | 118 | \newcommand\ccircuit[3]{ 119 | \framet{#1}{ 120 | \vspace{#2ex} 121 | \wfig{4.5in}{circuits/#3} 122 | }} 123 | 124 | \newcommand\circuit[5]{ 125 | \ccircuit{#1 \hfill \stats {#4}{#5}\hspace{2ex}}{#2}{#3} 126 | } 127 | 128 | \DeclareMathOperator{\D}{Depth} 129 | \DeclareMathOperator{\W}{Work} 130 | \nc\Size[1]{\lvert #1 \rvert} 131 | 132 | 133 | \author{\href{http://conal.net}{Conal Elliott}} 134 | \institute[Target]{Target Data Sciences} 135 | 136 | 137 | \graphicspath{{Figures/}} 138 | 139 | \definecolor{shadecolor}{rgb}{0.95,0.95,0.95} 140 | \setlength{\fboxsep}{0.75ex} 141 | \setlength{\fboxrule}{0.15pt} 142 | %% \setlength{\shadowsize}{2pt} 143 | 144 | %% \nc\cbox[1]{\raisebox{-0.5\height}{\fbox{#1}}} 145 | \nc\cpic[2]{\fbox{\wpicture{#1}{circuits/#2}}} 146 | \nc\ccap[3]{ 147 | \begin{minipage}[c]{0.48\textwidth} 148 | \begin{center} 149 | \cpic{#2}{#3}\par\vspace{0.5ex}#1\par 150 | \end{center} 151 | \end{minipage} 152 | } 153 | 154 | \setlength{\itemsep}{2ex} 155 | \setlength{\parskip}{1ex} 156 | % \setstretch{1.2} % ?? 157 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-lv5xlv11-highlight.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_lv5xlv11 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="0.8"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}"]; 17 | c10 [label="{{|}|+|{}}"]; 18 | c11 [label="{{|}|+|{}}"]; 19 | c12 [label="{{|}|+|{}}"]; 20 | c13 [label="{{|}|+|{}}"]; 21 | c14 [label="{{|}|+|{}}" color=red,style=bold]; 22 | c15 [label="{{|}|+|{}}"]; 23 | c16 [label="{{|}|+|{}}"]; 24 | c17 [label="{{|}|+|{}}"]; 25 | c18 [label="{{|}|+|{}}"]; 26 | c19 [label="{{|}|+|{}}"]; 27 | c20 [label="{{|}|+|{}}"]; 28 | c21 [label="{{|}|+|{}}"]; 29 | c22 [label="{{|}|+|{}}"]; 30 | c23 [label="{{|}|+|{}}"]; 31 | c24 [label="{{|}|+|{}}"]; 32 | c25 [label="{{|}|+|{}}"]; 33 | c26 [label="{0|{}}"]; 34 | c27 [label="{In|{|||||||||||||||}}"]; 35 | c28 [label="{{||||||||||||||||}|Out}"]; 36 | c27:Out0 -> c1:In0 []; 37 | c27:Out1 -> c1:In1 []; 38 | c27:Out5 -> c2:In0 []; 39 | c27:Out6 -> c2:In1 []; 40 | c2:Out0 -> c3:In0 []; 41 | c27:Out7 -> c3:In1 []; 42 | c3:Out0 -> c4:In0 []; 43 | c27:Out8 -> c4:In1 []; 44 | c4:Out0 -> c5:In0 []; 45 | c27:Out9 -> c5:In1 []; 46 | c5:Out0 -> c6:In0 []; 47 | c27:Out10 -> c6:In1 []; 48 | c6:Out0 -> c7:In0 []; 49 | c27:Out11 -> c7:In1 []; 50 | c7:Out0 -> c8:In0 []; 51 | c27:Out12 -> c8:In1 []; 52 | c8:Out0 -> c9:In0 []; 53 | c27:Out13 -> c9:In1 []; 54 | c9:Out0 -> c10:In0 []; 55 | c27:Out14 -> c10:In1 []; 56 | c10:Out0 -> c11:In0 []; 57 | c27:Out15 -> c11:In1 []; 58 | c1:Out0 -> c12:In0 []; 59 | c27:Out2 -> c12:In1 []; 60 | c12:Out0 -> c13:In0 []; 61 | c27:Out3 -> c13:In1 []; 62 | c13:Out0 -> c14:In0 []; 63 | c27:Out4 -> c14:In1 []; 64 | c14:Out0 -> c15:In0 [color=red,style=bold]; 65 | c27:Out5 -> c15:In1 []; 66 | c14:Out0 -> c16:In0 [color=red,style=bold]; 67 | c2:Out0 -> c16:In1 []; 68 | c14:Out0 -> c17:In0 [color=red,style=bold]; 69 | c3:Out0 -> c17:In1 []; 70 | c14:Out0 -> c18:In0 [color=red,style=bold]; 71 | c4:Out0 -> c18:In1 []; 72 | c14:Out0 -> c19:In0 [color=red,style=bold]; 73 | c5:Out0 -> c19:In1 []; 74 | c14:Out0 -> c20:In0 [color=red,style=bold]; 75 | c6:Out0 -> c20:In1 []; 76 | c14:Out0 -> c21:In0 [color=red,style=bold]; 77 | c7:Out0 -> c21:In1 []; 78 | c14:Out0 -> c22:In0 [color=red,style=bold]; 79 | c8:Out0 -> c22:In1 []; 80 | c14:Out0 -> c23:In0 [color=red,style=bold]; 81 | c9:Out0 -> c23:In1 []; 82 | c14:Out0 -> c24:In0 [color=red,style=bold]; 83 | c10:Out0 -> c24:In1 []; 84 | c14:Out0 -> c25:In0 [color=red,style=bold]; 85 | c11:Out0 -> c25:In1 []; 86 | c26:Out0 -> c28:In0 []; 87 | c27:Out0 -> c28:In1 []; 88 | c1:Out0 -> c28:In2 []; 89 | c12:Out0 -> c28:In3 []; 90 | c13:Out0 -> c28:In4 []; 91 | c14:Out0 -> c28:In5 [color=red,style=bold]; 92 | c15:Out0 -> c28:In6 []; 93 | c16:Out0 -> c28:In7 []; 94 | c17:Out0 -> c28:In8 []; 95 | c18:Out0 -> c28:In9 []; 96 | c19:Out0 -> c28:In10 []; 97 | c20:Out0 -> c28:In11 []; 98 | c21:Out0 -> c28:In12 []; 99 | c22:Out0 -> c28:In13 []; 100 | c23:Out0 -> c28:In14 []; 101 | c24:Out0 -> c28:In15 []; 102 | c25:Out0 -> c28:In16 []; 103 | } 104 | 105 | // lsums-lv5xlv11 components: 25 +, 1 0, 26 total. Max depth: 11. 106 | -------------------------------------------------------------------------------- /Figures/circuits/lsumsp-bush2.dot: -------------------------------------------------------------------------------- 1 | digraph lsumsp_bush2 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.9"; 8 | c0 [label="{{|}|+|{}}"]; 9 | c1 [label="{{|}|+|{}}"]; 10 | c2 [label="{{|}|+|{}}"]; 11 | c3 [label="{{|}|+|{}}"]; 12 | c4 [label="{{|}|+|{}}"]; 13 | c5 [label="{{|}|+|{}}"]; 14 | c6 [label="{{|}|+|{}}"]; 15 | c7 [label="{{|}|+|{}}"]; 16 | c8 [label="{{|}|+|{}}"]; 17 | c9 [label="{{|}|+|{}}"]; 18 | c10 [label="{{|}|+|{}}"]; 19 | c11 [label="{{|}|+|{}}"]; 20 | c12 [label="{{|}|+|{}}"]; 21 | c13 [label="{{|}|+|{}}"]; 22 | c14 [label="{{|}|+|{}}"]; 23 | c15 [label="{{|}|+|{}}"]; 24 | c16 [label="{{|}|+|{}}"]; 25 | c17 [label="{{|}|+|{}}"]; 26 | c18 [label="{{|}|+|{}}"]; 27 | c19 [label="{{|}|+|{}}"]; 28 | c20 [label="{{|}|+|{}}"]; 29 | c21 [label="{{|}|+|{}}"]; 30 | c22 [label="{{|}|+|{}}"]; 31 | c23 [label="{{|}|+|{}}"]; 32 | c24 [label="{{|}|+|{}}"]; 33 | c25 [label="{{|}|+|{}}"]; 34 | c26 [label="{{|}|+|{}}"]; 35 | c27 [label="{{|}|+|{}}"]; 36 | c28 [label="{{|}|+|{}}"]; 37 | c30 [label="{In|{|||||||||||||||}}"]; 38 | c31 [label="{{|||||||||||||||}|Out}"]; 39 | c30:Out0 -> c0:In0 []; 40 | c30:Out1 -> c0:In1 []; 41 | c30:Out2 -> c1:In0 []; 42 | c30:Out3 -> c1:In1 []; 43 | c30:Out4 -> c2:In0 []; 44 | c30:Out5 -> c2:In1 []; 45 | c30:Out6 -> c3:In0 []; 46 | c30:Out7 -> c3:In1 []; 47 | c30:Out8 -> c4:In0 []; 48 | c30:Out9 -> c4:In1 []; 49 | c30:Out10 -> c5:In0 []; 50 | c30:Out11 -> c5:In1 []; 51 | c30:Out12 -> c6:In0 []; 52 | c30:Out13 -> c6:In1 []; 53 | c30:Out14 -> c7:In0 []; 54 | c30:Out15 -> c7:In1 []; 55 | c0:Out0 -> c8:In0 []; 56 | c30:Out2 -> c8:In1 []; 57 | c0:Out0 -> c9:In0 []; 58 | c1:Out0 -> c9:In1 []; 59 | c9:Out0 -> c10:In0 []; 60 | c30:Out4 -> c10:In1 []; 61 | c9:Out0 -> c11:In0 []; 62 | c2:Out0 -> c11:In1 []; 63 | c9:Out0 -> c12:In0 []; 64 | c15:Out0 -> c12:In1 []; 65 | c9:Out0 -> c13:In0 []; 66 | c14:Out0 -> c13:In1 []; 67 | c2:Out0 -> c14:In0 []; 68 | c30:Out6 -> c14:In1 []; 69 | c2:Out0 -> c15:In0 []; 70 | c3:Out0 -> c15:In1 []; 71 | c4:Out0 -> c16:In0 []; 72 | c30:Out10 -> c16:In1 []; 73 | c4:Out0 -> c17:In0 []; 74 | c5:Out0 -> c17:In1 []; 75 | c17:Out0 -> c18:In0 []; 76 | c20:Out0 -> c18:In1 []; 77 | c6:Out0 -> c19:In0 []; 78 | c30:Out14 -> c19:In1 []; 79 | c6:Out0 -> c20:In0 []; 80 | c7:Out0 -> c20:In1 []; 81 | c12:Out0 -> c21:In0 []; 82 | c30:Out8 -> c21:In1 []; 83 | c12:Out0 -> c22:In0 []; 84 | c4:Out0 -> c22:In1 []; 85 | c12:Out0 -> c23:In0 []; 86 | c17:Out0 -> c23:In1 []; 87 | c12:Out0 -> c24:In0 []; 88 | c16:Out0 -> c24:In1 []; 89 | c12:Out0 -> c25:In0 []; 90 | c18:Out0 -> c25:In1 []; 91 | c23:Out0 -> c26:In0 []; 92 | c30:Out12 -> c26:In1 []; 93 | c23:Out0 -> c27:In0 []; 94 | c6:Out0 -> c27:In1 []; 95 | c23:Out0 -> c28:In0 []; 96 | c19:Out0 -> c28:In1 []; 97 | c30:Out0 -> c31:In0 []; 98 | c0:Out0 -> c31:In1 []; 99 | c8:Out0 -> c31:In2 []; 100 | c9:Out0 -> c31:In3 []; 101 | c10:Out0 -> c31:In4 []; 102 | c11:Out0 -> c31:In5 []; 103 | c13:Out0 -> c31:In6 []; 104 | c12:Out0 -> c31:In7 []; 105 | c21:Out0 -> c31:In8 []; 106 | c22:Out0 -> c31:In9 []; 107 | c24:Out0 -> c31:In10 []; 108 | c23:Out0 -> c31:In11 []; 109 | c26:Out0 -> c31:In12 []; 110 | c27:Out0 -> c31:In13 []; 111 | c28:Out0 -> c31:In14 []; 112 | c25:Out0 -> c31:In15 []; 113 | } 114 | 115 | // lsumsp-bush2 components: 29 +. Max depth: 5. 116 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-bush2.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_bush2 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="2"; 8 | c0 [label="{{|}|+|{}}"]; 9 | c1 [label="{{|}|+|{}}"]; 10 | c2 [label="{{|}|+|{}}"]; 11 | c3 [label="{{|}|+|{}}"]; 12 | c4 [label="{{|}|+|{}}"]; 13 | c5 [label="{{|}|+|{}}"]; 14 | c6 [label="{{|}|+|{}}"]; 15 | c7 [label="{{|}|+|{}}"]; 16 | c8 [label="{{|}|+|{}}"]; 17 | c9 [label="{{|}|+|{}}"]; 18 | c10 [label="{{|}|+|{}}"]; 19 | c11 [label="{{|}|+|{}}"]; 20 | c12 [label="{{|}|+|{}}"]; 21 | c13 [label="{{|}|+|{}}"]; 22 | c14 [label="{{|}|+|{}}"]; 23 | c15 [label="{{|}|+|{}}"]; 24 | c16 [label="{{|}|+|{}}"]; 25 | c17 [label="{{|}|+|{}}"]; 26 | c18 [label="{{|}|+|{}}"]; 27 | c19 [label="{{|}|+|{}}"]; 28 | c20 [label="{{|}|+|{}}"]; 29 | c21 [label="{{|}|+|{}}"]; 30 | c22 [label="{{|}|+|{}}"]; 31 | c23 [label="{{|}|+|{}}"]; 32 | c24 [label="{{|}|+|{}}"]; 33 | c25 [label="{{|}|+|{}}"]; 34 | c26 [label="{{|}|+|{}}"]; 35 | c27 [label="{{|}|+|{}}"]; 36 | c28 [label="{{|}|+|{}}"]; 37 | c29 [label="{0|{}}"]; 38 | c30 [label="{In|{|||||||||||||||}}"]; 39 | c31 [label="{{||||||||||||||||}|Out}"]; 40 | c30:Out0 -> c0:In0 []; 41 | c30:Out1 -> c0:In1 []; 42 | c30:Out2 -> c1:In0 []; 43 | c30:Out3 -> c1:In1 []; 44 | c30:Out2 -> c2:In0 []; 45 | c0:Out0 -> c2:In1 []; 46 | c30:Out4 -> c3:In0 []; 47 | c30:Out5 -> c3:In1 []; 48 | c30:Out4 -> c4:In0 []; 49 | c15:Out0 -> c4:In1 []; 50 | c30:Out6 -> c5:In0 []; 51 | c30:Out7 -> c5:In1 []; 52 | c30:Out6 -> c6:In0 []; 53 | c3:Out0 -> c6:In1 []; 54 | c30:Out8 -> c7:In0 []; 55 | c30:Out9 -> c7:In1 []; 56 | c30:Out8 -> c8:In0 []; 57 | c17:Out0 -> c8:In1 []; 58 | c30:Out10 -> c9:In0 []; 59 | c30:Out11 -> c9:In1 []; 60 | c30:Out10 -> c10:In0 []; 61 | c7:Out0 -> c10:In1 []; 62 | c30:Out12 -> c11:In0 []; 63 | c30:Out13 -> c11:In1 []; 64 | c30:Out12 -> c12:In0 []; 65 | c23:Out0 -> c12:In1 []; 66 | c30:Out14 -> c13:In0 []; 67 | c30:Out15 -> c13:In1 []; 68 | c30:Out14 -> c14:In0 []; 69 | c11:Out0 -> c14:In1 []; 70 | c0:Out0 -> c15:In0 []; 71 | c1:Out0 -> c15:In1 []; 72 | c15:Out0 -> c16:In0 []; 73 | c3:Out0 -> c16:In1 []; 74 | c15:Out0 -> c17:In0 []; 75 | c19:Out0 -> c17:In1 []; 76 | c15:Out0 -> c18:In0 []; 77 | c6:Out0 -> c18:In1 []; 78 | c3:Out0 -> c19:In0 []; 79 | c5:Out0 -> c19:In1 []; 80 | c7:Out0 -> c20:In0 []; 81 | c9:Out0 -> c20:In1 []; 82 | c7:Out0 -> c21:In0 []; 83 | c17:Out0 -> c21:In1 []; 84 | c20:Out0 -> c22:In0 []; 85 | c25:Out0 -> c22:In1 []; 86 | c20:Out0 -> c23:In0 []; 87 | c17:Out0 -> c23:In1 []; 88 | c10:Out0 -> c24:In0 []; 89 | c17:Out0 -> c24:In1 []; 90 | c11:Out0 -> c25:In0 []; 91 | c13:Out0 -> c25:In1 []; 92 | c11:Out0 -> c26:In0 []; 93 | c23:Out0 -> c26:In1 []; 94 | c14:Out0 -> c27:In0 []; 95 | c23:Out0 -> c27:In1 []; 96 | c17:Out0 -> c28:In0 []; 97 | c22:Out0 -> c28:In1 []; 98 | c29:Out0 -> c31:In0 []; 99 | c30:Out0 -> c31:In1 []; 100 | c0:Out0 -> c31:In2 []; 101 | c2:Out0 -> c31:In3 []; 102 | c15:Out0 -> c31:In4 []; 103 | c4:Out0 -> c31:In5 []; 104 | c16:Out0 -> c31:In6 []; 105 | c18:Out0 -> c31:In7 []; 106 | c17:Out0 -> c31:In8 []; 107 | c8:Out0 -> c31:In9 []; 108 | c21:Out0 -> c31:In10 []; 109 | c24:Out0 -> c31:In11 []; 110 | c23:Out0 -> c31:In12 []; 111 | c12:Out0 -> c31:In13 []; 112 | c26:Out0 -> c31:In14 []; 113 | c27:Out0 -> c31:In15 []; 114 | c28:Out0 -> c31:In16 []; 115 | } 116 | 117 | // lsums-bush2 components: 29 +, 1 0, 30 total. Max depth: 5. 118 | -------------------------------------------------------------------------------- /Figures/circuits/lsumsp-lv5-5-6-r.dot: -------------------------------------------------------------------------------- 1 | digraph lsumsp_lv5_5_6_r { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.5"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}"]; 17 | c10 [label="{{|}|+|{}}"]; 18 | c11 [label="{{|}|+|{}}"]; 19 | c12 [label="{{|}|+|{}}"]; 20 | c13 [label="{{|}|+|{}}"]; 21 | c14 [label="{{|}|+|{}}"]; 22 | c15 [label="{{|}|+|{}}"]; 23 | c16 [label="{{|}|+|{}}"]; 24 | c17 [label="{{|}|+|{}}"]; 25 | c18 [label="{{|}|+|{}}"]; 26 | c19 [label="{{|}|+|{}}"]; 27 | c20 [label="{{|}|+|{}}"]; 28 | c21 [label="{{|}|+|{}}"]; 29 | c22 [label="{{|}|+|{}}"]; 30 | c23 [label="{{|}|+|{}}"]; 31 | c24 [label="{{|}|+|{}}"]; 32 | c25 [label="{{|}|+|{}}"]; 33 | c26 [label="{{|}|+|{}}"]; 34 | c27 [label="{{|}|+|{}}"]; 35 | c28 [label="{{|}|+|{}}"]; 36 | c29 [label="{{|}|+|{}}"]; 37 | c30 [label="{{|}|+|{}}"]; 38 | c32 [label="{In|{|||||||||||||||}}"]; 39 | c33 [label="{{|||||||||||||||}|Out}"]; 40 | c32:Out0 -> c1:In0 []; 41 | c32:Out1 -> c1:In1 []; 42 | c32:Out5 -> c2:In0 []; 43 | c32:Out6 -> c2:In1 []; 44 | c32:Out10 -> c3:In0 []; 45 | c32:Out11 -> c3:In1 []; 46 | c3:Out0 -> c4:In0 []; 47 | c32:Out12 -> c4:In1 []; 48 | c4:Out0 -> c5:In0 []; 49 | c32:Out13 -> c5:In1 []; 50 | c5:Out0 -> c6:In0 []; 51 | c32:Out14 -> c6:In1 []; 52 | c6:Out0 -> c7:In0 []; 53 | c32:Out15 -> c7:In1 []; 54 | c2:Out0 -> c8:In0 []; 55 | c32:Out7 -> c8:In1 []; 56 | c8:Out0 -> c9:In0 []; 57 | c32:Out8 -> c9:In1 []; 58 | c9:Out0 -> c10:In0 []; 59 | c32:Out9 -> c10:In1 []; 60 | c10:Out0 -> c11:In0 []; 61 | c32:Out10 -> c11:In1 []; 62 | c10:Out0 -> c12:In0 []; 63 | c3:Out0 -> c12:In1 []; 64 | c10:Out0 -> c13:In0 []; 65 | c4:Out0 -> c13:In1 []; 66 | c10:Out0 -> c14:In0 []; 67 | c5:Out0 -> c14:In1 []; 68 | c10:Out0 -> c15:In0 []; 69 | c6:Out0 -> c15:In1 []; 70 | c10:Out0 -> c16:In0 []; 71 | c7:Out0 -> c16:In1 []; 72 | c1:Out0 -> c17:In0 []; 73 | c32:Out2 -> c17:In1 []; 74 | c17:Out0 -> c18:In0 []; 75 | c32:Out3 -> c18:In1 []; 76 | c18:Out0 -> c19:In0 []; 77 | c32:Out4 -> c19:In1 []; 78 | c19:Out0 -> c20:In0 []; 79 | c32:Out5 -> c20:In1 []; 80 | c19:Out0 -> c21:In0 []; 81 | c2:Out0 -> c21:In1 []; 82 | c19:Out0 -> c22:In0 []; 83 | c8:Out0 -> c22:In1 []; 84 | c19:Out0 -> c23:In0 []; 85 | c9:Out0 -> c23:In1 []; 86 | c19:Out0 -> c24:In0 []; 87 | c10:Out0 -> c24:In1 []; 88 | c19:Out0 -> c25:In0 []; 89 | c11:Out0 -> c25:In1 []; 90 | c19:Out0 -> c26:In0 []; 91 | c12:Out0 -> c26:In1 []; 92 | c19:Out0 -> c27:In0 []; 93 | c13:Out0 -> c27:In1 []; 94 | c19:Out0 -> c28:In0 []; 95 | c14:Out0 -> c28:In1 []; 96 | c19:Out0 -> c29:In0 []; 97 | c15:Out0 -> c29:In1 []; 98 | c19:Out0 -> c30:In0 []; 99 | c16:Out0 -> c30:In1 []; 100 | c32:Out0 -> c33:In0 []; 101 | c1:Out0 -> c33:In1 []; 102 | c17:Out0 -> c33:In2 []; 103 | c18:Out0 -> c33:In3 []; 104 | c19:Out0 -> c33:In4 []; 105 | c20:Out0 -> c33:In5 []; 106 | c21:Out0 -> c33:In6 []; 107 | c22:Out0 -> c33:In7 []; 108 | c23:Out0 -> c33:In8 []; 109 | c24:Out0 -> c33:In9 []; 110 | c25:Out0 -> c33:In10 []; 111 | c26:Out0 -> c33:In11 []; 112 | c27:Out0 -> c33:In12 []; 113 | c28:Out0 -> c33:In13 []; 114 | c29:Out0 -> c33:In14 []; 115 | c30:Out0 -> c33:In15 []; 116 | } 117 | 118 | // lsumsp-lv5-5-6-r components: 30 +. Max depth: 7. 119 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-rb4.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_rb4 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="2.6"; 8 | c0 [label="{{|}|+|{}}"]; 9 | c1 [label="{{|}|+|{}}"]; 10 | c2 [label="{{|}|+|{}}"]; 11 | c3 [label="{{|}|+|{}}"]; 12 | c4 [label="{{|}|+|{}}"]; 13 | c5 [label="{{|}|+|{}}"]; 14 | c6 [label="{{|}|+|{}}"]; 15 | c7 [label="{{|}|+|{}}"]; 16 | c8 [label="{{|}|+|{}}"]; 17 | c9 [label="{{|}|+|{}}"]; 18 | c10 [label="{{|}|+|{}}"]; 19 | c11 [label="{{|}|+|{}}"]; 20 | c12 [label="{{|}|+|{}}"]; 21 | c13 [label="{{|}|+|{}}"]; 22 | c14 [label="{{|}|+|{}}"]; 23 | c15 [label="{{|}|+|{}}"]; 24 | c16 [label="{{|}|+|{}}"]; 25 | c17 [label="{{|}|+|{}}"]; 26 | c18 [label="{{|}|+|{}}"]; 27 | c19 [label="{{|}|+|{}}"]; 28 | c20 [label="{{|}|+|{}}"]; 29 | c21 [label="{{|}|+|{}}"]; 30 | c22 [label="{{|}|+|{}}"]; 31 | c23 [label="{{|}|+|{}}"]; 32 | c24 [label="{{|}|+|{}}"]; 33 | c25 [label="{{|}|+|{}}"]; 34 | c26 [label="{{|}|+|{}}"]; 35 | c27 [label="{{|}|+|{}}"]; 36 | c28 [label="{{|}|+|{}}"]; 37 | c29 [label="{{|}|+|{}}"]; 38 | c30 [label="{{|}|+|{}}"]; 39 | c31 [label="{{|}|+|{}}"]; 40 | c32 [label="{0|{}}"]; 41 | c33 [label="{In|{|||||||||||||||}}"]; 42 | c34 [label="{{||||||||||||||||}|Out}"]; 43 | c33:Out0 -> c0:In0; 44 | c33:Out1 -> c0:In1; 45 | c33:Out2 -> c1:In0; 46 | c33:Out3 -> c1:In1; 47 | c33:Out2 -> c2:In0; 48 | c0:Out0 -> c2:In1; 49 | c33:Out4 -> c3:In0; 50 | c33:Out5 -> c3:In1; 51 | c33:Out4 -> c4:In0; 52 | c15:Out0 -> c4:In1; 53 | c33:Out6 -> c5:In0; 54 | c33:Out7 -> c5:In1; 55 | c33:Out6 -> c6:In0; 56 | c3:Out0 -> c6:In1; 57 | c33:Out8 -> c7:In0; 58 | c33:Out9 -> c7:In1; 59 | c33:Out8 -> c8:In0; 60 | c17:Out0 -> c8:In1; 61 | c33:Out10 -> c9:In0; 62 | c33:Out11 -> c9:In1; 63 | c33:Out10 -> c10:In0; 64 | c7:Out0 -> c10:In1; 65 | c33:Out12 -> c11:In0; 66 | c33:Out13 -> c11:In1; 67 | c33:Out12 -> c12:In0; 68 | c27:Out0 -> c12:In1; 69 | c33:Out14 -> c13:In0; 70 | c33:Out15 -> c13:In1; 71 | c33:Out14 -> c14:In0; 72 | c11:Out0 -> c14:In1; 73 | c0:Out0 -> c15:In0; 74 | c1:Out0 -> c15:In1; 75 | c15:Out0 -> c16:In0; 76 | c3:Out0 -> c16:In1; 77 | c15:Out0 -> c17:In0; 78 | c19:Out0 -> c17:In1; 79 | c15:Out0 -> c18:In0; 80 | c6:Out0 -> c18:In1; 81 | c3:Out0 -> c19:In0; 82 | c5:Out0 -> c19:In1; 83 | c17:Out0 -> c20:In0; 84 | c7:Out0 -> c20:In1; 85 | c17:Out0 -> c21:In0; 86 | c27:Out0 -> c21:In1; 87 | c17:Out0 -> c22:In0; 88 | c10:Out0 -> c22:In1; 89 | c17:Out0 -> c23:In0; 90 | c29:Out0 -> c23:In1; 91 | c17:Out0 -> c24:In0; 92 | c12:Out0 -> c24:In1; 93 | c17:Out0 -> c25:In0; 94 | c28:Out0 -> c25:In1; 95 | c17:Out0 -> c26:In0; 96 | c30:Out0 -> c26:In1; 97 | c7:Out0 -> c27:In0; 98 | c9:Out0 -> c27:In1; 99 | c27:Out0 -> c28:In0; 100 | c11:Out0 -> c28:In1; 101 | c27:Out0 -> c29:In0; 102 | c31:Out0 -> c29:In1; 103 | c27:Out0 -> c30:In0; 104 | c14:Out0 -> c30:In1; 105 | c11:Out0 -> c31:In0; 106 | c13:Out0 -> c31:In1; 107 | c32:Out0 -> c34:In0; 108 | c33:Out0 -> c34:In1; 109 | c0:Out0 -> c34:In2; 110 | c2:Out0 -> c34:In3; 111 | c15:Out0 -> c34:In4; 112 | c4:Out0 -> c34:In5; 113 | c16:Out0 -> c34:In6; 114 | c18:Out0 -> c34:In7; 115 | c17:Out0 -> c34:In8; 116 | c8:Out0 -> c34:In9; 117 | c20:Out0 -> c34:In10; 118 | c22:Out0 -> c34:In11; 119 | c21:Out0 -> c34:In12; 120 | c24:Out0 -> c34:In13; 121 | c25:Out0 -> c34:In14; 122 | c26:Out0 -> c34:In15; 123 | c23:Out0 -> c34:In16; 124 | } 125 | 126 | // lsums-rb4 components: 32 +, 1 0, 33 total. Max depth: 4. 127 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-lv5-5-6-r.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_lv5_5_6_r { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.5"; 8 | c1 [label="{{|}|+|{}}"]; 9 | c2 [label="{{|}|+|{}}"]; 10 | c3 [label="{{|}|+|{}}"]; 11 | c4 [label="{{|}|+|{}}"]; 12 | c5 [label="{{|}|+|{}}"]; 13 | c6 [label="{{|}|+|{}}"]; 14 | c7 [label="{{|}|+|{}}"]; 15 | c8 [label="{{|}|+|{}}"]; 16 | c9 [label="{{|}|+|{}}"]; 17 | c10 [label="{{|}|+|{}}"]; 18 | c11 [label="{{|}|+|{}}"]; 19 | c12 [label="{{|}|+|{}}"]; 20 | c13 [label="{{|}|+|{}}"]; 21 | c14 [label="{{|}|+|{}}"]; 22 | c15 [label="{{|}|+|{}}"]; 23 | c16 [label="{{|}|+|{}}"]; 24 | c17 [label="{{|}|+|{}}"]; 25 | c18 [label="{{|}|+|{}}"]; 26 | c19 [label="{{|}|+|{}}"]; 27 | c20 [label="{{|}|+|{}}"]; 28 | c21 [label="{{|}|+|{}}"]; 29 | c22 [label="{{|}|+|{}}"]; 30 | c23 [label="{{|}|+|{}}"]; 31 | c24 [label="{{|}|+|{}}"]; 32 | c25 [label="{{|}|+|{}}"]; 33 | c26 [label="{{|}|+|{}}"]; 34 | c27 [label="{{|}|+|{}}"]; 35 | c28 [label="{{|}|+|{}}"]; 36 | c29 [label="{{|}|+|{}}"]; 37 | c30 [label="{{|}|+|{}}"]; 38 | c31 [label="{0|{}}"]; 39 | c32 [label="{In|{|||||||||||||||}}"]; 40 | c33 [label="{{||||||||||||||||}|Out}"]; 41 | c32:Out0 -> c1:In0 []; 42 | c32:Out1 -> c1:In1 []; 43 | c32:Out5 -> c2:In0 []; 44 | c32:Out6 -> c2:In1 []; 45 | c32:Out10 -> c3:In0 []; 46 | c32:Out11 -> c3:In1 []; 47 | c3:Out0 -> c4:In0 []; 48 | c32:Out12 -> c4:In1 []; 49 | c4:Out0 -> c5:In0 []; 50 | c32:Out13 -> c5:In1 []; 51 | c5:Out0 -> c6:In0 []; 52 | c32:Out14 -> c6:In1 []; 53 | c6:Out0 -> c7:In0 []; 54 | c32:Out15 -> c7:In1 []; 55 | c2:Out0 -> c8:In0 []; 56 | c32:Out7 -> c8:In1 []; 57 | c8:Out0 -> c9:In0 []; 58 | c32:Out8 -> c9:In1 []; 59 | c9:Out0 -> c10:In0 []; 60 | c32:Out9 -> c10:In1 []; 61 | c10:Out0 -> c11:In0 []; 62 | c32:Out10 -> c11:In1 []; 63 | c10:Out0 -> c12:In0 []; 64 | c3:Out0 -> c12:In1 []; 65 | c10:Out0 -> c13:In0 []; 66 | c4:Out0 -> c13:In1 []; 67 | c10:Out0 -> c14:In0 []; 68 | c5:Out0 -> c14:In1 []; 69 | c10:Out0 -> c15:In0 []; 70 | c6:Out0 -> c15:In1 []; 71 | c10:Out0 -> c16:In0 []; 72 | c7:Out0 -> c16:In1 []; 73 | c1:Out0 -> c17:In0 []; 74 | c32:Out2 -> c17:In1 []; 75 | c17:Out0 -> c18:In0 []; 76 | c32:Out3 -> c18:In1 []; 77 | c18:Out0 -> c19:In0 []; 78 | c32:Out4 -> c19:In1 []; 79 | c19:Out0 -> c20:In0 []; 80 | c32:Out5 -> c20:In1 []; 81 | c19:Out0 -> c21:In0 []; 82 | c2:Out0 -> c21:In1 []; 83 | c19:Out0 -> c22:In0 []; 84 | c8:Out0 -> c22:In1 []; 85 | c19:Out0 -> c23:In0 []; 86 | c9:Out0 -> c23:In1 []; 87 | c19:Out0 -> c24:In0 []; 88 | c10:Out0 -> c24:In1 []; 89 | c19:Out0 -> c25:In0 []; 90 | c11:Out0 -> c25:In1 []; 91 | c19:Out0 -> c26:In0 []; 92 | c12:Out0 -> c26:In1 []; 93 | c19:Out0 -> c27:In0 []; 94 | c13:Out0 -> c27:In1 []; 95 | c19:Out0 -> c28:In0 []; 96 | c14:Out0 -> c28:In1 []; 97 | c19:Out0 -> c29:In0 []; 98 | c15:Out0 -> c29:In1 []; 99 | c19:Out0 -> c30:In0 []; 100 | c16:Out0 -> c30:In1 []; 101 | c31:Out0 -> c33:In0 []; 102 | c32:Out0 -> c33:In1 []; 103 | c1:Out0 -> c33:In2 []; 104 | c17:Out0 -> c33:In3 []; 105 | c18:Out0 -> c33:In4 []; 106 | c19:Out0 -> c33:In5 []; 107 | c20:Out0 -> c33:In6 []; 108 | c21:Out0 -> c33:In7 []; 109 | c22:Out0 -> c33:In8 []; 110 | c23:Out0 -> c33:In9 []; 111 | c24:Out0 -> c33:In10 []; 112 | c25:Out0 -> c33:In11 []; 113 | c26:Out0 -> c33:In12 []; 114 | c27:Out0 -> c33:In13 []; 115 | c28:Out0 -> c33:In14 []; 116 | c29:Out0 -> c33:In15 []; 117 | c30:Out0 -> c33:In16 []; 118 | } 119 | 120 | // lsums-lv5-5-6-r components: 30 +, 1 0, 31 total. Max depth: 7. 121 | -------------------------------------------------------------------------------- /Figures/circuits/lsumsp-rb4.dot: -------------------------------------------------------------------------------- 1 | digraph lsumsp_rb4 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="2.5"; 8 | c0 [label="{{|}|+|{}}"]; 9 | c1 [label="{{|}|+|{}}"]; 10 | c2 [label="{{|}|+|{}}"]; 11 | c3 [label="{{|}|+|{}}"]; 12 | c4 [label="{{|}|+|{}}"]; 13 | c5 [label="{{|}|+|{}}"]; 14 | c6 [label="{{|}|+|{}}"]; 15 | c7 [label="{{|}|+|{}}"]; 16 | c8 [label="{{|}|+|{}}"]; 17 | c9 [label="{{|}|+|{}}"]; 18 | c10 [label="{{|}|+|{}}"]; 19 | c11 [label="{{|}|+|{}}"]; 20 | c12 [label="{{|}|+|{}}"]; 21 | c13 [label="{{|}|+|{}}"]; 22 | c14 [label="{{|}|+|{}}"]; 23 | c15 [label="{{|}|+|{}}"]; 24 | c16 [label="{{|}|+|{}}"]; 25 | c17 [label="{{|}|+|{}}"]; 26 | c18 [label="{{|}|+|{}}"]; 27 | c19 [label="{{|}|+|{}}"]; 28 | c20 [label="{{|}|+|{}}"]; 29 | c21 [label="{{|}|+|{}}"]; 30 | c22 [label="{{|}|+|{}}"]; 31 | c23 [label="{{|}|+|{}}"]; 32 | c24 [label="{{|}|+|{}}"]; 33 | c25 [label="{{|}|+|{}}"]; 34 | c26 [label="{{|}|+|{}}"]; 35 | c27 [label="{{|}|+|{}}"]; 36 | c28 [label="{{|}|+|{}}"]; 37 | c29 [label="{{|}|+|{}}"]; 38 | c30 [label="{{|}|+|{}}"]; 39 | c31 [label="{{|}|+|{}}"]; 40 | c33 [label="{In|{|||||||||||||||}}"]; 41 | c34 [label="{{|||||||||||||||}|Out}"]; 42 | c33:Out0 -> c0:In0 []; 43 | c33:Out1 -> c0:In1 []; 44 | c33:Out2 -> c1:In0 []; 45 | c33:Out3 -> c1:In1 []; 46 | c33:Out4 -> c2:In0 []; 47 | c33:Out5 -> c2:In1 []; 48 | c33:Out6 -> c3:In0 []; 49 | c33:Out7 -> c3:In1 []; 50 | c33:Out8 -> c4:In0 []; 51 | c33:Out9 -> c4:In1 []; 52 | c33:Out10 -> c5:In0 []; 53 | c33:Out11 -> c5:In1 []; 54 | c33:Out12 -> c6:In0 []; 55 | c33:Out13 -> c6:In1 []; 56 | c33:Out14 -> c7:In0 []; 57 | c33:Out15 -> c7:In1 []; 58 | c0:Out0 -> c8:In0 []; 59 | c33:Out2 -> c8:In1 []; 60 | c0:Out0 -> c9:In0 []; 61 | c1:Out0 -> c9:In1 []; 62 | c9:Out0 -> c10:In0 []; 63 | c33:Out4 -> c10:In1 []; 64 | c9:Out0 -> c11:In0 []; 65 | c2:Out0 -> c11:In1 []; 66 | c9:Out0 -> c12:In0 []; 67 | c15:Out0 -> c12:In1 []; 68 | c9:Out0 -> c13:In0 []; 69 | c14:Out0 -> c13:In1 []; 70 | c2:Out0 -> c14:In0 []; 71 | c33:Out6 -> c14:In1 []; 72 | c2:Out0 -> c15:In0 []; 73 | c3:Out0 -> c15:In1 []; 74 | c12:Out0 -> c16:In0 []; 75 | c33:Out8 -> c16:In1 []; 76 | c12:Out0 -> c17:In0 []; 77 | c4:Out0 -> c17:In1 []; 78 | c12:Out0 -> c18:In0 []; 79 | c25:Out0 -> c18:In1 []; 80 | c12:Out0 -> c19:In0 []; 81 | c24:Out0 -> c19:In1 []; 82 | c12:Out0 -> c20:In0 []; 83 | c28:Out0 -> c20:In1 []; 84 | c12:Out0 -> c21:In0 []; 85 | c26:Out0 -> c21:In1 []; 86 | c12:Out0 -> c22:In0 []; 87 | c27:Out0 -> c22:In1 []; 88 | c12:Out0 -> c23:In0 []; 89 | c29:Out0 -> c23:In1 []; 90 | c4:Out0 -> c24:In0 []; 91 | c33:Out10 -> c24:In1 []; 92 | c4:Out0 -> c25:In0 []; 93 | c5:Out0 -> c25:In1 []; 94 | c25:Out0 -> c26:In0 []; 95 | c33:Out12 -> c26:In1 []; 96 | c25:Out0 -> c27:In0 []; 97 | c6:Out0 -> c27:In1 []; 98 | c25:Out0 -> c28:In0 []; 99 | c31:Out0 -> c28:In1 []; 100 | c25:Out0 -> c29:In0 []; 101 | c30:Out0 -> c29:In1 []; 102 | c6:Out0 -> c30:In0 []; 103 | c33:Out14 -> c30:In1 []; 104 | c6:Out0 -> c31:In0 []; 105 | c7:Out0 -> c31:In1 []; 106 | c33:Out0 -> c34:In0 []; 107 | c0:Out0 -> c34:In1 []; 108 | c8:Out0 -> c34:In2 []; 109 | c9:Out0 -> c34:In3 []; 110 | c10:Out0 -> c34:In4 []; 111 | c11:Out0 -> c34:In5 []; 112 | c13:Out0 -> c34:In6 []; 113 | c12:Out0 -> c34:In7 []; 114 | c16:Out0 -> c34:In8 []; 115 | c17:Out0 -> c34:In9 []; 116 | c19:Out0 -> c34:In10 []; 117 | c18:Out0 -> c34:In11 []; 118 | c21:Out0 -> c34:In12 []; 119 | c22:Out0 -> c34:In13 []; 120 | c23:Out0 -> c34:In14 []; 121 | c20:Out0 -> c34:In15 []; 122 | } 123 | 124 | // lsumsp-rb4 components: 32 +. Max depth: 4. 125 | -------------------------------------------------------------------------------- /Figures/circuits/powers-rb4-no-hash.dot: -------------------------------------------------------------------------------- 1 | digraph powers_rb4_no_hash { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="2.55"; 8 | c0 [label="{{||||||||||||||||}|Out}"]; 9 | c1 [label="{{|}|\×|{}}"]; 10 | c2 [label="{{|}|\×|{}}"]; 11 | c3 [label="{{|}|\×|{}}"]; 12 | c4 [label="{{|}|\×|{}}"]; 13 | c5 [label="{{|}|\×|{}}"]; 14 | c6 [label="{{|}|\×|{}}"]; 15 | c7 [label="{{|}|\×|{}}"]; 16 | c8 [label="{1|{}}"]; 17 | c9 [label="{{|}|\×|{}}"]; 18 | c11 [label="{{|}|\×|{}}"]; 19 | c12 [label="{{|}|\×|{}}"]; 20 | c13 [label="{{|}|\×|{}}"]; 21 | c15 [label="{{|}|\×|{}}"]; 22 | c17 [label="{{|}|\×|{}}"]; 23 | c19 [label="{{|}|\×|{}}"]; 24 | c22 [label="{{|}|\×|{}}"]; 25 | c27 [label="{{|}|\×|{}}"]; 26 | c31 [label="{{|}|\×|{}}"]; 27 | c33 [label="{{|}|\×|{}}"]; 28 | c36 [label="{{|}|\×|{}}"]; 29 | c41 [label="{{|}|\×|{}}"]; 30 | c45 [label="{{|}|\×|{}}"]; 31 | c46 [label="{{|}|\×|{}}"]; 32 | c47 [label="{{|}|\×|{}}"]; 33 | c49 [label="{{|}|\×|{}}"]; 34 | c51 [label="{{|}|\×|{}}"]; 35 | c53 [label="{{|}|\×|{}}"]; 36 | c56 [label="{{|}|\×|{}}"]; 37 | c61 [label="{{|}|\×|{}}"]; 38 | c65 [label="{{|}|\×|{}}"]; 39 | c67 [label="{{|}|\×|{}}"]; 40 | c70 [label="{{|}|\×|{}}"]; 41 | c75 [label="{{|}|\×|{}}"]; 42 | c79 [label="{In|{}}"]; 43 | c8:Out0 -> c0:In0 []; 44 | c79:Out0 -> c0:In1 []; 45 | c75:Out0 -> c0:In2 []; 46 | c65:Out0 -> c0:In3 []; 47 | c67:Out0 -> c0:In4 []; 48 | c47:Out0 -> c0:In5 []; 49 | c46:Out0 -> c0:In6 []; 50 | c45:Out0 -> c0:In7 []; 51 | c49:Out0 -> c0:In8 []; 52 | c7:Out0 -> c0:In9 []; 53 | c6:Out0 -> c0:In10 []; 54 | c5:Out0 -> c0:In11 []; 55 | c4:Out0 -> c0:In12 []; 56 | c3:Out0 -> c0:In13 []; 57 | c2:Out0 -> c0:In14 []; 58 | c1:Out0 -> c0:In15 []; 59 | c9:Out0 -> c0:In16 []; 60 | c49:Out0 -> c1:In0 []; 61 | c11:Out0 -> c1:In1 []; 62 | c49:Out0 -> c2:In0 []; 63 | c12:Out0 -> c2:In1 []; 64 | c49:Out0 -> c3:In0 []; 65 | c13:Out0 -> c3:In1 []; 66 | c49:Out0 -> c4:In0 []; 67 | c33:Out0 -> c4:In1 []; 68 | c49:Out0 -> c5:In0 []; 69 | c31:Out0 -> c5:In1 []; 70 | c49:Out0 -> c6:In0 []; 71 | c41:Out0 -> c6:In1 []; 72 | c49:Out0 -> c7:In0 []; 73 | c79:Out0 -> c7:In1 []; 74 | c49:Out0 -> c9:In0 []; 75 | c15:Out0 -> c9:In1 []; 76 | c33:Out0 -> c11:In0 []; 77 | c17:Out0 -> c11:In1 []; 78 | c33:Out0 -> c12:In0 []; 79 | c27:Out0 -> c12:In1 []; 80 | c33:Out0 -> c13:In0 []; 81 | c79:Out0 -> c13:In1 []; 82 | c33:Out0 -> c15:In0 []; 83 | c19:Out0 -> c15:In1 []; 84 | c27:Out0 -> c17:In0 []; 85 | c79:Out0 -> c17:In1 []; 86 | c27:Out0 -> c19:In0 []; 87 | c22:Out0 -> c19:In1 []; 88 | c79:Out0 -> c22:In0 []; 89 | c79:Out0 -> c22:In1 []; 90 | c79:Out0 -> c27:In0 []; 91 | c79:Out0 -> c27:In1 []; 92 | c41:Out0 -> c31:In0 []; 93 | c79:Out0 -> c31:In1 []; 94 | c41:Out0 -> c33:In0 []; 95 | c36:Out0 -> c33:In1 []; 96 | c79:Out0 -> c36:In0 []; 97 | c79:Out0 -> c36:In1 []; 98 | c79:Out0 -> c41:In0 []; 99 | c79:Out0 -> c41:In1 []; 100 | c67:Out0 -> c45:In0 []; 101 | c51:Out0 -> c45:In1 []; 102 | c67:Out0 -> c46:In0 []; 103 | c61:Out0 -> c46:In1 []; 104 | c67:Out0 -> c47:In0 []; 105 | c79:Out0 -> c47:In1 []; 106 | c67:Out0 -> c49:In0 []; 107 | c53:Out0 -> c49:In1 []; 108 | c61:Out0 -> c51:In0 []; 109 | c79:Out0 -> c51:In1 []; 110 | c61:Out0 -> c53:In0 []; 111 | c56:Out0 -> c53:In1 []; 112 | c79:Out0 -> c56:In0 []; 113 | c79:Out0 -> c56:In1 []; 114 | c79:Out0 -> c61:In0 []; 115 | c79:Out0 -> c61:In1 []; 116 | c75:Out0 -> c65:In0 []; 117 | c79:Out0 -> c65:In1 []; 118 | c75:Out0 -> c67:In0 []; 119 | c70:Out0 -> c67:In1 []; 120 | c79:Out0 -> c70:In0 []; 121 | c79:Out0 -> c70:In1 []; 122 | c79:Out0 -> c75:In0 []; 123 | c79:Out0 -> c75:In1 []; 124 | } 125 | 126 | // powers-rb4-no-hash components: 1 1, 32 ×, 33 total. Max depth: 4. 127 | -------------------------------------------------------------------------------- /Figures/circuits/lproducts-rb4.dot: -------------------------------------------------------------------------------- 1 | digraph lproducts_rb4 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="2.5"; 8 | c0 [label="{1|{}}"]; 9 | c1 [label="{In|{|||||||||||||||}}"]; 10 | c2 [label="{{||||||||||||||||}|Out}"]; 11 | c3 [label="{{|}|\×|{}}"]; 12 | c4 [label="{{|}|\×|{}}"]; 13 | c5 [label="{{|}|\×|{}}"]; 14 | c6 [label="{{|}|\×|{}}"]; 15 | c7 [label="{{|}|\×|{}}"]; 16 | c8 [label="{{|}|\×|{}}"]; 17 | c9 [label="{{|}|\×|{}}"]; 18 | c10 [label="{{|}|\×|{}}"]; 19 | c11 [label="{{|}|\×|{}}"]; 20 | c12 [label="{{|}|\×|{}}"]; 21 | c13 [label="{{|}|\×|{}}"]; 22 | c14 [label="{{|}|\×|{}}"]; 23 | c15 [label="{{|}|\×|{}}"]; 24 | c16 [label="{{|}|\×|{}}"]; 25 | c17 [label="{{|}|\×|{}}"]; 26 | c18 [label="{{|}|\×|{}}"]; 27 | c19 [label="{{|}|\×|{}}"]; 28 | c20 [label="{{|}|\×|{}}"]; 29 | c21 [label="{{|}|\×|{}}"]; 30 | c22 [label="{{|}|\×|{}}"]; 31 | c23 [label="{{|}|\×|{}}"]; 32 | c24 [label="{{|}|\×|{}}"]; 33 | c25 [label="{{|}|\×|{}}"]; 34 | c26 [label="{{|}|\×|{}}"]; 35 | c27 [label="{{|}|\×|{}}"]; 36 | c28 [label="{{|}|\×|{}}"]; 37 | c29 [label="{{|}|\×|{}}"]; 38 | c30 [label="{{|}|\×|{}}"]; 39 | c31 [label="{{|}|\×|{}}"]; 40 | c32 [label="{{|}|\×|{}}"]; 41 | c33 [label="{{|}|\×|{}}"]; 42 | c34 [label="{{|}|\×|{}}"]; 43 | c0:Out0 -> c2:In0 []; 44 | c1:Out0 -> c2:In1 []; 45 | c3:Out0 -> c2:In2 []; 46 | c11:Out0 -> c2:In3 []; 47 | c12:Out0 -> c2:In4 []; 48 | c13:Out0 -> c2:In5 []; 49 | c14:Out0 -> c2:In6 []; 50 | c16:Out0 -> c2:In7 []; 51 | c15:Out0 -> c2:In8 []; 52 | c19:Out0 -> c2:In9 []; 53 | c20:Out0 -> c2:In10 []; 54 | c22:Out0 -> c2:In11 []; 55 | c21:Out0 -> c2:In12 []; 56 | c24:Out0 -> c2:In13 []; 57 | c25:Out0 -> c2:In14 []; 58 | c26:Out0 -> c2:In15 []; 59 | c23:Out0 -> c2:In16 []; 60 | c1:Out0 -> c3:In0 []; 61 | c1:Out1 -> c3:In1 []; 62 | c1:Out2 -> c4:In0 []; 63 | c1:Out3 -> c4:In1 []; 64 | c1:Out4 -> c5:In0 []; 65 | c1:Out5 -> c5:In1 []; 66 | c1:Out6 -> c6:In0 []; 67 | c1:Out7 -> c6:In1 []; 68 | c1:Out8 -> c7:In0 []; 69 | c1:Out9 -> c7:In1 []; 70 | c1:Out10 -> c8:In0 []; 71 | c1:Out11 -> c8:In1 []; 72 | c1:Out12 -> c9:In0 []; 73 | c1:Out13 -> c9:In1 []; 74 | c1:Out14 -> c10:In0 []; 75 | c1:Out15 -> c10:In1 []; 76 | c3:Out0 -> c11:In0 []; 77 | c1:Out2 -> c11:In1 []; 78 | c3:Out0 -> c12:In0 []; 79 | c4:Out0 -> c12:In1 []; 80 | c12:Out0 -> c13:In0 []; 81 | c1:Out4 -> c13:In1 []; 82 | c12:Out0 -> c14:In0 []; 83 | c5:Out0 -> c14:In1 []; 84 | c12:Out0 -> c15:In0 []; 85 | c18:Out0 -> c15:In1 []; 86 | c12:Out0 -> c16:In0 []; 87 | c17:Out0 -> c16:In1 []; 88 | c5:Out0 -> c17:In0 []; 89 | c1:Out6 -> c17:In1 []; 90 | c5:Out0 -> c18:In0 []; 91 | c6:Out0 -> c18:In1 []; 92 | c15:Out0 -> c19:In0 []; 93 | c1:Out8 -> c19:In1 []; 94 | c15:Out0 -> c20:In0 []; 95 | c7:Out0 -> c20:In1 []; 96 | c15:Out0 -> c21:In0 []; 97 | c28:Out0 -> c21:In1 []; 98 | c15:Out0 -> c22:In0 []; 99 | c27:Out0 -> c22:In1 []; 100 | c15:Out0 -> c23:In0 []; 101 | c31:Out0 -> c23:In1 []; 102 | c15:Out0 -> c24:In0 []; 103 | c29:Out0 -> c24:In1 []; 104 | c15:Out0 -> c25:In0 []; 105 | c30:Out0 -> c25:In1 []; 106 | c15:Out0 -> c26:In0 []; 107 | c32:Out0 -> c26:In1 []; 108 | c7:Out0 -> c27:In0 []; 109 | c1:Out10 -> c27:In1 []; 110 | c7:Out0 -> c28:In0 []; 111 | c8:Out0 -> c28:In1 []; 112 | c28:Out0 -> c29:In0 []; 113 | c1:Out12 -> c29:In1 []; 114 | c28:Out0 -> c30:In0 []; 115 | c9:Out0 -> c30:In1 []; 116 | c28:Out0 -> c31:In0 []; 117 | c34:Out0 -> c31:In1 []; 118 | c28:Out0 -> c32:In0 []; 119 | c33:Out0 -> c32:In1 []; 120 | c9:Out0 -> c33:In0 []; 121 | c1:Out14 -> c33:In1 []; 122 | c9:Out0 -> c34:In0 []; 123 | c10:Out0 -> c34:In1 []; 124 | } 125 | 126 | // lproducts-rb4 components: 1 1, 32 ×, 33 total. Max depth: 4. 127 | -------------------------------------------------------------------------------- /Figures/circuits/scanAdd-lv8.dot: -------------------------------------------------------------------------------- 1 | digraph scanAdd_lv8 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="0.65"; 8 | c2 [label="{In|{|||||||||||||||}}"]; 9 | c3 [label="{{||||||||}|Out}"]; 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 | c21 [label="{{|}|\∧|{}}"]; 20 | c22 [label="{{|}|\∧|{}}"]; 21 | c23 [label="{{|}|\∧|{}}"]; 22 | c24 [label="{{|}|\∧|{}}"]; 23 | c25 [label="{{|}|\∧|{}}"]; 24 | c26 [label="{{|}|\∧|{}}"]; 25 | c27 [label="{{|}|\∨|{}}"]; 26 | c28 [label="{{|}|\∨|{}}"]; 27 | c29 [label="{{|}|\∨|{}}"]; 28 | c30 [label="{{|}|\∨|{}}"]; 29 | c31 [label="{{|}|\∨|{}}"]; 30 | c32 [label="{{|}|\∨|{}}"]; 31 | c33 [label="{{|}|\∨|{}}"]; 32 | c34 [label="{{|}|\⊕|{}}"]; 33 | c35 [label="{{|}|\⊕|{}}"]; 34 | c36 [label="{{|}|\⊕|{}}"]; 35 | c37 [label="{{|}|\⊕|{}}"]; 36 | c38 [label="{{|}|\⊕|{}}"]; 37 | c39 [label="{{|}|\⊕|{}}"]; 38 | c40 [label="{{|}|\⊕|{}}"]; 39 | c41 [label="{{|}|\⊕|{}}"]; 40 | c42 [label="{{|}|\⊕|{}}"]; 41 | c43 [label="{{|}|\⊕|{}}"]; 42 | c44 [label="{{|}|\⊕|{}}"]; 43 | c45 [label="{{|}|\⊕|{}}"]; 44 | c46 [label="{{|}|\⊕|{}}"]; 45 | c47 [label="{{|}|\⊕|{}}"]; 46 | c48 [label="{{|}|\⊕|{}}"]; 47 | c34:Out0 -> c3:In0 []; 48 | c42:Out0 -> c3:In1 []; 49 | c43:Out0 -> c3:In2 []; 50 | c44:Out0 -> c3:In3 []; 51 | c45:Out0 -> c3:In4 []; 52 | c46:Out0 -> c3:In5 []; 53 | c47:Out0 -> c3:In6 []; 54 | c48:Out0 -> c3:In7 []; 55 | c33:Out0 -> c3:In8 []; 56 | c2:Out0 -> c5:In0 []; 57 | c2:Out1 -> c5:In1 []; 58 | c2:Out2 -> c6:In0 []; 59 | c2:Out3 -> c6:In1 []; 60 | c2:Out4 -> c7:In0 []; 61 | c2:Out5 -> c7:In1 []; 62 | c2:Out6 -> c8:In0 []; 63 | c2:Out7 -> c8:In1 []; 64 | c2:Out8 -> c9:In0 []; 65 | c2:Out9 -> c9:In1 []; 66 | c2:Out10 -> c10:In0 []; 67 | c2:Out11 -> c10:In1 []; 68 | c2:Out12 -> c11:In0 []; 69 | c2:Out13 -> c11:In1 []; 70 | c2:Out14 -> c12:In0 []; 71 | c2:Out15 -> c12:In1 []; 72 | c5:Out0 -> c13:In0 []; 73 | c35:Out0 -> c13:In1 []; 74 | c27:Out0 -> c21:In0 []; 75 | c36:Out0 -> c21:In1 []; 76 | c28:Out0 -> c22:In0 []; 77 | c37:Out0 -> c22:In1 []; 78 | c29:Out0 -> c23:In0 []; 79 | c38:Out0 -> c23:In1 []; 80 | c30:Out0 -> c24:In0 []; 81 | c39:Out0 -> c24:In1 []; 82 | c31:Out0 -> c25:In0 []; 83 | c40:Out0 -> c25:In1 []; 84 | c32:Out0 -> c26:In0 []; 85 | c41:Out0 -> c26:In1 []; 86 | c6:Out0 -> c27:In0 []; 87 | c13:Out0 -> c27:In1 []; 88 | c7:Out0 -> c28:In0 []; 89 | c21:Out0 -> c28:In1 []; 90 | c8:Out0 -> c29:In0 []; 91 | c22:Out0 -> c29:In1 []; 92 | c9:Out0 -> c30:In0 []; 93 | c23:Out0 -> c30:In1 []; 94 | c10:Out0 -> c31:In0 []; 95 | c24:Out0 -> c31:In1 []; 96 | c11:Out0 -> c32:In0 []; 97 | c25:Out0 -> c32:In1 []; 98 | c12:Out0 -> c33:In0 []; 99 | c26:Out0 -> c33:In1 []; 100 | c2:Out0 -> c34:In0 []; 101 | c2:Out1 -> c34:In1 []; 102 | c2:Out2 -> c35:In0 []; 103 | c2:Out3 -> c35:In1 []; 104 | c2:Out4 -> c36:In0 []; 105 | c2:Out5 -> c36:In1 []; 106 | c2:Out6 -> c37:In0 []; 107 | c2:Out7 -> c37:In1 []; 108 | c2:Out8 -> c38:In0 []; 109 | c2:Out9 -> c38:In1 []; 110 | c2:Out10 -> c39:In0 []; 111 | c2:Out11 -> c39:In1 []; 112 | c2:Out12 -> c40:In0 []; 113 | c2:Out13 -> c40:In1 []; 114 | c2:Out14 -> c41:In0 []; 115 | c2:Out15 -> c41:In1 []; 116 | c35:Out0 -> c42:In0 []; 117 | c5:Out0 -> c42:In1 []; 118 | c36:Out0 -> c43:In0 []; 119 | c27:Out0 -> c43:In1 []; 120 | c37:Out0 -> c44:In0 []; 121 | c28:Out0 -> c44:In1 []; 122 | c38:Out0 -> c45:In0 []; 123 | c29:Out0 -> c45:In1 []; 124 | c39:Out0 -> c46:In0 []; 125 | c30:Out0 -> c46:In1 []; 126 | c40:Out0 -> c47:In0 []; 127 | c31:Out0 -> c47:In1 []; 128 | c41:Out0 -> c48:In0 []; 129 | c32:Out0 -> c48:In1 []; 130 | } 131 | 132 | // scanAdd-lv8 components: 15 ∧, 7 ∨, 15 ⊕, 37 total. Max depth: 15. 133 | -------------------------------------------------------------------------------- /Figures/circuits/lsums-rv8-no-hash-no-opt.dot: -------------------------------------------------------------------------------- 1 | digraph lsums_rv8_no_hash_no_opt { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="2.6"; 8 | c0 [label="{{||||||||}|Out}"]; 9 | c2 [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="{0|{}}"]; 18 | c12 [label="{{|}|+|{}}"]; 19 | c14 [label="{{|}|+|{}}"]; 20 | c15 [label="{{|}|+|{}}"]; 21 | c16 [label="{{|}|+|{}}"]; 22 | c17 [label="{{|}|+|{}}"]; 23 | c18 [label="{{|}|+|{}}"]; 24 | c19 [label="{{|}|+|{}}"]; 25 | c20 [label="{0|{}}"]; 26 | c21 [label="{{|}|+|{}}"]; 27 | c23 [label="{{|}|+|{}}"]; 28 | c24 [label="{{|}|+|{}}"]; 29 | c25 [label="{{|}|+|{}}"]; 30 | c26 [label="{{|}|+|{}}"]; 31 | c27 [label="{{|}|+|{}}"]; 32 | c28 [label="{0|{}}"]; 33 | c29 [label="{{|}|+|{}}"]; 34 | c31 [label="{{|}|+|{}}"]; 35 | c32 [label="{{|}|+|{}}"]; 36 | c33 [label="{{|}|+|{}}"]; 37 | c34 [label="{{|}|+|{}}"]; 38 | c35 [label="{0|{}}"]; 39 | c36 [label="{{|}|+|{}}"]; 40 | c38 [label="{{|}|+|{}}"]; 41 | c39 [label="{{|}|+|{}}"]; 42 | c40 [label="{{|}|+|{}}"]; 43 | c41 [label="{0|{}}"]; 44 | c42 [label="{{|}|+|{}}"]; 45 | c44 [label="{{|}|+|{}}"]; 46 | c45 [label="{{|}|+|{}}"]; 47 | c46 [label="{0|{}}"]; 48 | c47 [label="{{|}|+|{}}"]; 49 | c49 [label="{{|}|+|{}}"]; 50 | c50 [label="{0|{}}"]; 51 | c51 [label="{{|}|+|{}}"]; 52 | c53 [label="{0|{}}"]; 53 | c54 [label="{0|{}}"]; 54 | c57 [label="{In|{|||||||}}"]; 55 | c11:Out0 -> c0:In0 []; 56 | c10:Out0 -> c0:In1 []; 57 | c9:Out0 -> c0:In2 []; 58 | c8:Out0 -> c0:In3 []; 59 | c7:Out0 -> c0:In4 []; 60 | c6:Out0 -> c0:In5 []; 61 | c5:Out0 -> c0:In6 []; 62 | c4:Out0 -> c0:In7 []; 63 | c2:Out0 -> c0:In8 []; 64 | c57:Out0 -> c2:In0 []; 65 | c12:Out0 -> c2:In1 []; 66 | c57:Out0 -> c4:In0 []; 67 | c14:Out0 -> c4:In1 []; 68 | c57:Out0 -> c5:In0 []; 69 | c15:Out0 -> c5:In1 []; 70 | c57:Out0 -> c6:In0 []; 71 | c16:Out0 -> c6:In1 []; 72 | c57:Out0 -> c7:In0 []; 73 | c17:Out0 -> c7:In1 []; 74 | c57:Out0 -> c8:In0 []; 75 | c18:Out0 -> c8:In1 []; 76 | c57:Out0 -> c9:In0 []; 77 | c19:Out0 -> c9:In1 []; 78 | c57:Out0 -> c10:In0 []; 79 | c20:Out0 -> c10:In1 []; 80 | c57:Out1 -> c12:In0 []; 81 | c21:Out0 -> c12:In1 []; 82 | c57:Out1 -> c14:In0 []; 83 | c23:Out0 -> c14:In1 []; 84 | c57:Out1 -> c15:In0 []; 85 | c24:Out0 -> c15:In1 []; 86 | c57:Out1 -> c16:In0 []; 87 | c25:Out0 -> c16:In1 []; 88 | c57:Out1 -> c17:In0 []; 89 | c26:Out0 -> c17:In1 []; 90 | c57:Out1 -> c18:In0 []; 91 | c27:Out0 -> c18:In1 []; 92 | c57:Out1 -> c19:In0 []; 93 | c28:Out0 -> c19:In1 []; 94 | c57:Out2 -> c21:In0 []; 95 | c29:Out0 -> c21:In1 []; 96 | c57:Out2 -> c23:In0 []; 97 | c31:Out0 -> c23:In1 []; 98 | c57:Out2 -> c24:In0 []; 99 | c32:Out0 -> c24:In1 []; 100 | c57:Out2 -> c25:In0 []; 101 | c33:Out0 -> c25:In1 []; 102 | c57:Out2 -> c26:In0 []; 103 | c34:Out0 -> c26:In1 []; 104 | c57:Out2 -> c27:In0 []; 105 | c35:Out0 -> c27:In1 []; 106 | c57:Out3 -> c29:In0 []; 107 | c36:Out0 -> c29:In1 []; 108 | c57:Out3 -> c31:In0 []; 109 | c38:Out0 -> c31:In1 []; 110 | c57:Out3 -> c32:In0 []; 111 | c39:Out0 -> c32:In1 []; 112 | c57:Out3 -> c33:In0 []; 113 | c40:Out0 -> c33:In1 []; 114 | c57:Out3 -> c34:In0 []; 115 | c41:Out0 -> c34:In1 []; 116 | c57:Out4 -> c36:In0 []; 117 | c42:Out0 -> c36:In1 []; 118 | c57:Out4 -> c38:In0 []; 119 | c44:Out0 -> c38:In1 []; 120 | c57:Out4 -> c39:In0 []; 121 | c45:Out0 -> c39:In1 []; 122 | c57:Out4 -> c40:In0 []; 123 | c46:Out0 -> c40:In1 []; 124 | c57:Out5 -> c42:In0 []; 125 | c47:Out0 -> c42:In1 []; 126 | c57:Out5 -> c44:In0 []; 127 | c49:Out0 -> c44:In1 []; 128 | c57:Out5 -> c45:In0 []; 129 | c50:Out0 -> c45:In1 []; 130 | c57:Out6 -> c47:In0 []; 131 | c51:Out0 -> c47:In1 []; 132 | c57:Out6 -> c49:In0 []; 133 | c53:Out0 -> c49:In1 []; 134 | c57:Out7 -> c51:In0 []; 135 | c54:Out0 -> c51:In1 []; 136 | } 137 | 138 | // lsums-rv8-no-hash-no-opt components: 36 +, 9 0, 45 total. Max depth: 8. 139 | -------------------------------------------------------------------------------- /Figures/circuits/evalPoly-rb4.dot: -------------------------------------------------------------------------------- 1 | digraph evalPoly_rb4 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.3"; 8 | c0 [label="{{|}|+|{}}"]; 9 | c1 [label="{{|}|+|{}}"]; 10 | c2 [label="{{|}|+|{}}"]; 11 | c3 [label="{{|}|+|{}}"]; 12 | c4 [label="{{|}|+|{}}"]; 13 | c5 [label="{{|}|+|{}}"]; 14 | c6 [label="{{|}|+|{}}"]; 15 | c7 [label="{{|}|+|{}}"]; 16 | c8 [label="{{|}|+|{}}"]; 17 | c9 [label="{{|}|+|{}}"]; 18 | c10 [label="{{|}|+|{}}"]; 19 | c11 [label="{{|}|+|{}}"]; 20 | c12 [label="{{|}|+|{}}"]; 21 | c13 [label="{{|}|+|{}}"]; 22 | c14 [label="{{|}|+|{}}"]; 23 | c16 [label="{In|{||||||||||||||||}}"]; 24 | c17 [label="{{}|Out}"]; 25 | c18 [label="{{|}|\×|{}}"]; 26 | c19 [label="{{|}|\×|{}}"]; 27 | c20 [label="{{|}|\×|{}}"]; 28 | c21 [label="{{|}|\×|{}}"]; 29 | c22 [label="{{|}|\×|{}}"]; 30 | c23 [label="{{|}|\×|{}}"]; 31 | c24 [label="{{|}|\×|{}}"]; 32 | c25 [label="{{|}|\×|{}}"]; 33 | c26 [label="{{|}|\×|{}}"]; 34 | c27 [label="{{|}|\×|{}}"]; 35 | c28 [label="{{|}|\×|{}}"]; 36 | c29 [label="{{|}|\×|{}}"]; 37 | c30 [label="{{|}|\×|{}}"]; 38 | c31 [label="{{|}|\×|{}}"]; 39 | c32 [label="{{|}|\×|{}}"]; 40 | c33 [label="{{|}|\×|{}}"]; 41 | c34 [label="{{|}|\×|{}}"]; 42 | c35 [label="{{|}|\×|{}}"]; 43 | c36 [label="{{|}|\×|{}}"]; 44 | c37 [label="{{|}|\×|{}}"]; 45 | c38 [label="{{|}|\×|{}}"]; 46 | c39 [label="{{|}|\×|{}}"]; 47 | c40 [label="{{|}|\×|{}}"]; 48 | c41 [label="{{|}|\×|{}}"]; 49 | c42 [label="{{|}|\×|{}}"]; 50 | c43 [label="{{|}|\×|{}}"]; 51 | c45 [label="{{|}|\×|{}}"]; 52 | c46 [label="{{|}|\×|{}}"]; 53 | c47 [label="{{|}|\×|{}}"]; 54 | c16:Out0 -> c0:In0 []; 55 | c18:Out0 -> c0:In1 []; 56 | c19:Out0 -> c1:In0 []; 57 | c20:Out0 -> c1:In1 []; 58 | c21:Out0 -> c2:In0 []; 59 | c22:Out0 -> c2:In1 []; 60 | c23:Out0 -> c3:In0 []; 61 | c24:Out0 -> c3:In1 []; 62 | c25:Out0 -> c4:In0 []; 63 | c26:Out0 -> c4:In1 []; 64 | c27:Out0 -> c5:In0 []; 65 | c28:Out0 -> c5:In1 []; 66 | c29:Out0 -> c6:In0 []; 67 | c30:Out0 -> c6:In1 []; 68 | c31:Out0 -> c7:In0 []; 69 | c32:Out0 -> c7:In1 []; 70 | c0:Out0 -> c8:In0 []; 71 | c1:Out0 -> c8:In1 []; 72 | c8:Out0 -> c9:In0 []; 73 | c10:Out0 -> c9:In1 []; 74 | c2:Out0 -> c10:In0 []; 75 | c3:Out0 -> c10:In1 []; 76 | c9:Out0 -> c11:In0 []; 77 | c13:Out0 -> c11:In1 []; 78 | c4:Out0 -> c12:In0 []; 79 | c5:Out0 -> c12:In1 []; 80 | c12:Out0 -> c13:In0 []; 81 | c14:Out0 -> c13:In1 []; 82 | c6:Out0 -> c14:In0 []; 83 | c7:Out0 -> c14:In1 []; 84 | c11:Out0 -> c17:In0 []; 85 | c16:Out1 -> c18:In0 []; 86 | c16:Out16 -> c18:In1 []; 87 | c16:Out2 -> c19:In0 []; 88 | c33:Out0 -> c19:In1 []; 89 | c16:Out3 -> c20:In0 []; 90 | c34:Out0 -> c20:In1 []; 91 | c16:Out4 -> c21:In0 []; 92 | c35:Out0 -> c21:In1 []; 93 | c16:Out5 -> c22:In0 []; 94 | c36:Out0 -> c22:In1 []; 95 | c16:Out6 -> c23:In0 []; 96 | c37:Out0 -> c23:In1 []; 97 | c16:Out7 -> c24:In0 []; 98 | c39:Out0 -> c24:In1 []; 99 | c16:Out8 -> c25:In0 []; 100 | c38:Out0 -> c25:In1 []; 101 | c16:Out9 -> c26:In0 []; 102 | c40:Out0 -> c26:In1 []; 103 | c16:Out10 -> c27:In0 []; 104 | c41:Out0 -> c27:In1 []; 105 | c16:Out11 -> c28:In0 []; 106 | c43:Out0 -> c28:In1 []; 107 | c16:Out12 -> c29:In0 []; 108 | c42:Out0 -> c29:In1 []; 109 | c16:Out13 -> c30:In0 []; 110 | c45:Out0 -> c30:In1 []; 111 | c16:Out14 -> c31:In0 []; 112 | c46:Out0 -> c31:In1 []; 113 | c16:Out15 -> c32:In0 []; 114 | c47:Out0 -> c32:In1 []; 115 | c16:Out16 -> c33:In0 []; 116 | c16:Out16 -> c33:In1 []; 117 | c33:Out0 -> c34:In0 []; 118 | c16:Out16 -> c34:In1 []; 119 | c33:Out0 -> c35:In0 []; 120 | c33:Out0 -> c35:In1 []; 121 | c35:Out0 -> c36:In0 []; 122 | c16:Out16 -> c36:In1 []; 123 | c35:Out0 -> c37:In0 []; 124 | c33:Out0 -> c37:In1 []; 125 | c35:Out0 -> c38:In0 []; 126 | c35:Out0 -> c38:In1 []; 127 | c35:Out0 -> c39:In0 []; 128 | c34:Out0 -> c39:In1 []; 129 | c38:Out0 -> c40:In0 []; 130 | c16:Out16 -> c40:In1 []; 131 | c38:Out0 -> c41:In0 []; 132 | c33:Out0 -> c41:In1 []; 133 | c38:Out0 -> c42:In0 []; 134 | c35:Out0 -> c42:In1 []; 135 | c38:Out0 -> c43:In0 []; 136 | c34:Out0 -> c43:In1 []; 137 | c38:Out0 -> c45:In0 []; 138 | c36:Out0 -> c45:In1 []; 139 | c38:Out0 -> c46:In0 []; 140 | c37:Out0 -> c46:In1 []; 141 | c38:Out0 -> c47:In0 []; 142 | c39:Out0 -> c47:In1 []; 143 | } 144 | 145 | // evalPoly-rb4 components: 15 +, 29 ×, 44 total. Max depth: 9. 146 | -------------------------------------------------------------------------------- /Figures/circuits/scanAdd-lb3.dot: -------------------------------------------------------------------------------- 1 | digraph scanAdd_lb3 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.1"; 8 | c1 [label="{In|{|||||||||||||||}}"]; 9 | c2 [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 | c14 [label="{{|}|\∧|{}}"]; 20 | c16 [label="{{|}|\∧|{}}"]; 21 | c17 [label="{{|}|\∧|{}}"]; 22 | c19 [label="{{|}|\∧|{}}"]; 23 | c20 [label="{{|}|\∧|{}}"]; 24 | c22 [label="{{|}|\∧|{}}"]; 25 | c23 [label="{{|}|\∧|{}}"]; 26 | c24 [label="{{|}|\∧|{}}"]; 27 | c26 [label="{{|}|\∧|{}}"]; 28 | c28 [label="{{|}|\∧|{}}"]; 29 | c29 [label="{{|}|\∧|{}}"]; 30 | c30 [label="{{|}|\∧|{}}"]; 31 | c31 [label="{{|}|\∧|{}}"]; 32 | c33 [label="{{|}|\∧|{}}"]; 33 | c34 [label="{{|}|\∨|{}}"]; 34 | c35 [label="{{|}|\∨|{}}"]; 35 | c36 [label="{{|}|\∨|{}}"]; 36 | c37 [label="{{|}|\∨|{}}"]; 37 | c38 [label="{{|}|\∨|{}}"]; 38 | c39 [label="{{|}|\∨|{}}"]; 39 | c40 [label="{{|}|\∨|{}}"]; 40 | c41 [label="{{|}|\∨|{}}"]; 41 | c42 [label="{{|}|\∨|{}}"]; 42 | c43 [label="{{|}|\∨|{}}"]; 43 | c44 [label="{{|}|\∨|{}}"]; 44 | c45 [label="{{|}|\⊕|{}}"]; 45 | c46 [label="{{|}|\⊕|{}}"]; 46 | c47 [label="{{|}|\⊕|{}}"]; 47 | c48 [label="{{|}|\⊕|{}}"]; 48 | c49 [label="{{|}|\⊕|{}}"]; 49 | c50 [label="{{|}|\⊕|{}}"]; 50 | c51 [label="{{|}|\⊕|{}}"]; 51 | c52 [label="{{|}|\⊕|{}}"]; 52 | c53 [label="{{|}|\⊕|{}}"]; 53 | c54 [label="{{|}|\⊕|{}}"]; 54 | c55 [label="{{|}|\⊕|{}}"]; 55 | c56 [label="{{|}|\⊕|{}}"]; 56 | c57 [label="{{|}|\⊕|{}}"]; 57 | c58 [label="{{|}|\⊕|{}}"]; 58 | c59 [label="{{|}|\⊕|{}}"]; 59 | c45:Out0 -> c2:In0 []; 60 | c53:Out0 -> c2:In1 []; 61 | c54:Out0 -> c2:In2 []; 62 | c55:Out0 -> c2:In3 []; 63 | c56:Out0 -> c2:In4 []; 64 | c57:Out0 -> c2:In5 []; 65 | c58:Out0 -> c2:In6 []; 66 | c59:Out0 -> c2:In7 []; 67 | c44:Out0 -> c2:In8 []; 68 | c1:Out0 -> c4:In0 []; 69 | c1:Out1 -> c4:In1 []; 70 | c1:Out2 -> c5:In0 []; 71 | c1:Out3 -> c5:In1 []; 72 | c1:Out4 -> c6:In0 []; 73 | c1:Out5 -> c6:In1 []; 74 | c1:Out6 -> c7:In0 []; 75 | c1:Out7 -> c7:In1 []; 76 | c1:Out8 -> c8:In0 []; 77 | c1:Out9 -> c8:In1 []; 78 | c1:Out10 -> c9:In0 []; 79 | c1:Out11 -> c9:In1 []; 80 | c1:Out12 -> c10:In0 []; 81 | c1:Out13 -> c10:In1 []; 82 | c1:Out14 -> c11:In0 []; 83 | c1:Out15 -> c11:In1 []; 84 | c4:Out0 -> c12:In0 []; 85 | c46:Out0 -> c12:In1 []; 86 | c6:Out0 -> c14:In0 []; 87 | c48:Out0 -> c14:In1 []; 88 | c48:Out0 -> c16:In0 []; 89 | c47:Out0 -> c16:In1 []; 90 | c8:Out0 -> c17:In0 []; 91 | c50:Out0 -> c17:In1 []; 92 | c50:Out0 -> c19:In0 []; 93 | c49:Out0 -> c19:In1 []; 94 | c10:Out0 -> c20:In0 []; 95 | c52:Out0 -> c20:In1 []; 96 | c52:Out0 -> c22:In0 []; 97 | c51:Out0 -> c22:In1 []; 98 | c34:Out0 -> c23:In0 []; 99 | c47:Out0 -> c23:In1 []; 100 | c34:Out0 -> c24:In0 []; 101 | c16:Out0 -> c24:In1 []; 102 | c38:Out0 -> c26:In0 []; 103 | c22:Out0 -> c26:In1 []; 104 | c22:Out0 -> c28:In0 []; 105 | c19:Out0 -> c28:In1 []; 106 | c41:Out0 -> c29:In0 []; 107 | c49:Out0 -> c29:In1 []; 108 | c41:Out0 -> c30:In0 []; 109 | c19:Out0 -> c30:In1 []; 110 | c41:Out0 -> c31:In0 []; 111 | c28:Out0 -> c31:In1 []; 112 | c42:Out0 -> c33:In0 []; 113 | c51:Out0 -> c33:In1 []; 114 | c5:Out0 -> c34:In0 []; 115 | c12:Out0 -> c34:In1 []; 116 | c6:Out0 -> c35:In0 []; 117 | c23:Out0 -> c35:In1 []; 118 | c7:Out0 -> c36:In0 []; 119 | c14:Out0 -> c36:In1 []; 120 | c8:Out0 -> c37:In0 []; 121 | c29:Out0 -> c37:In1 []; 122 | c9:Out0 -> c38:In0 []; 123 | c17:Out0 -> c38:In1 []; 124 | c10:Out0 -> c39:In0 []; 125 | c33:Out0 -> c39:In1 []; 126 | c11:Out0 -> c40:In0 []; 127 | c20:Out0 -> c40:In1 []; 128 | c36:Out0 -> c41:In0 []; 129 | c24:Out0 -> c41:In1 []; 130 | c38:Out0 -> c42:In0 []; 131 | c30:Out0 -> c42:In1 []; 132 | c40:Out0 -> c43:In0 []; 133 | c26:Out0 -> c43:In1 []; 134 | c43:Out0 -> c44:In0 []; 135 | c31:Out0 -> c44:In1 []; 136 | c1:Out0 -> c45:In0 []; 137 | c1:Out1 -> c45:In1 []; 138 | c1:Out2 -> c46:In0 []; 139 | c1:Out3 -> c46:In1 []; 140 | c1:Out4 -> c47:In0 []; 141 | c1:Out5 -> c47:In1 []; 142 | c1:Out6 -> c48:In0 []; 143 | c1:Out7 -> c48:In1 []; 144 | c1:Out8 -> c49:In0 []; 145 | c1:Out9 -> c49:In1 []; 146 | c1:Out10 -> c50:In0 []; 147 | c1:Out11 -> c50:In1 []; 148 | c1:Out12 -> c51:In0 []; 149 | c1:Out13 -> c51:In1 []; 150 | c1:Out14 -> c52:In0 []; 151 | c1:Out15 -> c52:In1 []; 152 | c46:Out0 -> c53:In0 []; 153 | c4:Out0 -> c53:In1 []; 154 | c47:Out0 -> c54:In0 []; 155 | c34:Out0 -> c54:In1 []; 156 | c48:Out0 -> c55:In0 []; 157 | c35:Out0 -> c55:In1 []; 158 | c49:Out0 -> c56:In0 []; 159 | c41:Out0 -> c56:In1 []; 160 | c50:Out0 -> c57:In0 []; 161 | c37:Out0 -> c57:In1 []; 162 | c51:Out0 -> c58:In0 []; 163 | c42:Out0 -> c58:In1 []; 164 | c52:Out0 -> c59:In0 []; 165 | c39:Out0 -> c59:In1 []; 166 | } 167 | 168 | // scanAdd-lb3 components: 23 ∧, 11 ∨, 15 ⊕, 49 total. Max depth: 10. 169 | -------------------------------------------------------------------------------- /notes.md: -------------------------------------------------------------------------------- 1 | % High-level algorithm design for reschedulable computation, Part 1 -- Understanding parallel scan 2 | % Conal Elliott, Tabula 3 | % October 8, 2013 4 | 5 | # Abstract 6 | 7 | Mainstream programming languages are based on a sequential notion of computation pioneered by John von Neumann and others and are thereby deeply biased toward *sequential* execution. 8 | This bias persists even in the presence of multi-threading, because sequentiality is much lighter weight notationally and much simpler semantically in these languages. 9 | For the age of massively parallel computation, we will want to remove sequential bias from both the hardware platforms on which we execute *and* the software languages and techniques in which we think about and express algorithms. 10 | We call these platforms, languages, and techniques "*reschedulable*" to reflect that scheduling of operations is automated, rather than specified explicitly. 11 | In other words, low- and high-level computation descriptions include *what* and *how*, leaving a great deal of flexibility about *when*. 12 | 13 | The Spacetime architecture and the Stylus toolchain provide an execution platform and hardware-level "programming" interface for reschedulable computing but lacks the productivity of a modern, high-level programming language. 14 | "von Neumann" (i.e., imperative) languages help with productivity, but over-sequentialize. 15 | In contrast, purely functional programming enables elegant specification of algorithms without accidental sequentialization and thus holds great promise for reschedulable programming. 16 | 17 | This talk will give a flavor of purely functional, rescheduling-friendly programming by means of the example of parallel prefix computation, also known as "scan". 18 | 19 | We'll start with a simple and precise scan specification that leads directly to an algorithm performing quadratic work and hence quadratic time in a sequential implementation. 20 | A simple observation leads to a familiar sequential algorithm performing linear work. 21 | This version, however, does not lend itself to parallel execution. 22 | Next, a simple divide-and-conquer idea leads to a functional algorithm that can execute in $O (\log n)$ time and $O (n \log n)$ work, given sufficient computational resources. 23 | Playing with variations and poking at asymmetries, we then see a beautiful generalization that leads to a linear work algorithm while retaining logarithmic time. 24 | 25 | # Misc thoughts on presentation 26 | 27 | Parallel prefix / scan: 28 | 29 | * Show a few formulations. 30 | * Describe how I grappled with what's going on: 31 | * What's the index bit fiddling about? 32 | * Hunch about binary trees. 33 | * Habitual top-down assumption leads to work-inefficient algorithm. 34 | * MSB: top-down trees. LSB: bottom-up trees. 35 | * ... 36 | * Conclusions/reflections: 37 | * We can approach software elegantly and rigorously. 38 | * Avoid operationalisms such as explicit scheduling (sequential or parallel). 39 | * What makes scheduling matter semantically? Mutation. 40 | * Instead, use order-independent foundation: math / pure functional programming. 41 | * Data dependencies remain, constraining but not dictating a schedule. 42 | * Minimize critical path. 43 | * There are some common "control" patterns, such as fold, unfold, and scan. 44 | Defined "algebraically": equational properties ("laws"). 45 | * There are some common "data" patterns, such as products, sum, and composition. 46 | * Mix and match to construct algorithms. 47 | * Some combinations are more parallel-friendly than others. 48 | * Monoids matter! 49 | 50 | Parallel prefix computation: 51 | 52 | * Also called "parallel scan" 53 | * Scan variations: 54 | * Exclusive vs inclusive: 55 | * $[0, a_0,a_0+a_1, ...]$ and $a_0+a_1+\cdots$ 56 | * $[a_0,a_0+a_1, ...]$ 57 | * Prefix vs suffix 58 | * We'll look at exclusive, prefix 59 | * Simple sequential algorithm (on arrays) 60 | * *In C with mutation* 61 | * Simple sequential algorithm (on lists) 62 | * *In Haskell without mutation* 63 | * Arrays, reasoning, and parallelism 64 | * Array is a very common choice for parallel programming 65 | * Constant-time random access, 66 | * but not really. 67 | * Down side: arrays are monolithic. 68 | * Either an small element or a large array. 69 | * We lose compositionality of reasoning & programming. 70 | * Symptoms: 71 | * Index fiddling 72 | * Array slicing (perhaps implicit) 73 | * Bounds checking/errors 74 | * If not arrays, what? 75 | * Divide and conquer 76 | * Many array algorithms require size $2^n$. 77 | * Sub-problems are half-size ($2^{n-1}$). 78 | * Where else do we see this pattern? 79 | * Binary trees 80 | * Specifically, perfect binary leaf trees 81 | * Two variants: 82 | * Top-down: pair of trees (common) 83 | * Bottom-up: tree of pairs (uncommon, but useful) 84 | * Non-$2^n$ arrays via non-perfect trees 85 | 86 | Idea for presenting parallel scan: 87 | 88 | * Do top-down: 89 | * Scan left 90 | * Scan right 91 | * Adjust right and sum 92 | * Aesthetic criticism: asymmetric--we tweak right and sum but not left. 93 | * Analysis: 94 | * Depth: $\log n$ 95 | * Work: $n \log n$ 96 | * Next consider wider branching: ternary, quaternary, ..., octary, etc. 97 | * What changes? 98 | * We have to adjust *all but the first* subtree. 99 | * Note sequence of adjustments. 100 | Looks familiar? 101 | 102 | ## Prefix computations 103 | 104 | Given a sequence of elements $[a_0,a_1,\ldots,a_{n-1}]$, compute sums of all sequence prefixes: 105 | 106 | $$[0, a_0+a_1, ...,a_0+a_1+\cdots+a_{n-1}]$$ 107 | 108 | 109 | Variations: 110 | 111 | * Exclusive vs inclusive: 112 | * $[0, a_0,a_0+a_1, ...]$ and $a_0+a_1+\cdots$ 113 | * $[a_0,a_0+a_1, ...]$ 114 | * Prefix vs suffix 115 | * We'll look at exclusive, prefix 116 | -------------------------------------------------------------------------------- /discarded.lhs: -------------------------------------------------------------------------------- 1 | %% -*- latex -*- 2 | 3 | \framet{Prefix sum (left scan)}{ 4 | \wfig{4.5in}{circuits/lsumsp-lv8} 5 | 6 | \vspace{1ex} \pause 7 | \emph{Work:} $O(n)$ 8 | 9 | \pause 10 | \emph{Depth}: $O(n)$ (ideal parallel ``time'') 11 | 12 | \vspace{2ex} 13 | \pause 14 | Linear \emph{dependency chain} thwarts parallelism (depth $<$ work). 15 | } 16 | 17 | \circuit{Prefix sum (left scan)}{0}{lsumsp-lv16}{15}{15} 18 | 19 | %% \circuit{Divide and conquer?}{3}{lsumsp-lv8-and-lv8}{14}{7} 20 | 21 | \circuit{Divide and conquer?}{3}{lsumsp-lv8-lv8-unknown}{14+?}{7+?} 22 | 23 | %% \framet{Divide and conquer? \hfill \stats {14}{7}\hspace{2ex}}{ 24 | %% \vspace{0ex} 25 | %% \wfig{4.5in}{circuits/lsumsp-lv8-wide} 26 | %% \wfig{4.5in}{circuits/lsumsp-lv8-wide} 27 | %% \vspace{-2ex} 28 | %% \emph{Then what?} 29 | %% } 30 | 31 | \circuit{Divide and conquer}{0}{lsumsp-p-lv8}{22}{8} 32 | 33 | \circuit{$5+11$}{1}{lsumsp-lv5xlv11}{25}{11} 34 | \circuit{$(5+5)+6$}{0}{lsumsp-lv5-5-6-l}{24}{6} 35 | \circuit{$5+(5+6)$}{-1}{lsumsp-lv5-5-6-r}{30}{7} 36 | \circuit{$8+8$}{0}{lsumsp-p-lv8}{22}{8} 37 | 38 | \circuit{$2 \times 8$}{0}{lsumsp-p-lv8}{22}{8} 39 | \circuit{$8 \times 2$}{0}{lsumsp-lv8-p}{22}{8} 40 | \circuit{$4 \times 4$}{0}{lsumsp-lv4olv4}{24}{6} 41 | 42 | \circuit{$4^2$}{0}{lsumsp-lv4olv4}{24}{6} 43 | 44 | \circuit{$2^4 = ((2 \times 2) \times 2) \times 2$}{-1}{lsumsp-lb4}{26}{6} 45 | 46 | \circuit{$2^4 = 2 \times (2 \times (2 \times 2))$}{-1}{lsumsp-rb4}{32}{4} 47 | 48 | \circuit{$2^4 = (2^2)^2 = (2 \times 2) \times (2 \times 2)$}{-1}{lsumsp-bush2}{29}{5} 49 | 50 | 51 | \framet{Parallel scan as a class}{ 52 | \begin{code} 53 | class LScan f where 54 | lscan :: Monoid a => f a -> f a 55 | \end{code} 56 | 57 | \pause 58 | \vspace{-3ex} 59 | \begin{code} 60 | SPACE default lscan :: (Generic1 f, LScan (Rep1 f)) 61 | => Monoid a => f a -> f a 62 | lscan = to1 . lscan . from1 63 | \end{code} 64 | } 65 | 66 | \framet{Easy instances}{ 67 | 68 | \begin{code} 69 | instance LScan V1 where lscan = \ SPC case 70 | 71 | instance LScan U1 where lscan = id 72 | 73 | instance LScan Par1 where lscan = id 74 | \end{code} 75 | 76 | \pause 77 | \begin{code} 78 | instance (LScan f, LScan g) => LScan (f :+: g) where 79 | lscan (L1 fa ) = L1 (lscan fa ) 80 | lscan (R1 ga ) = R1 (lscan ga ) 81 | \end{code} 82 | } 83 | 84 | \framet{Products}{ 85 | \vspace{3ex} 86 | \begin{code} 87 | instance (LScan f, LScan g, Functor g) => LScan (f :*: g) where 88 | lscan (fa :*: ga) = fa' :*: ga' 89 | where 90 | fa' = lscan fa 91 | ga' = (last' fa' `mappend` NOP) <#> lscan ga 92 | 93 | last' :: f a -> a 94 | last' = ... 95 | \end{code} 96 | 97 | \pause\vspace{3ex} 98 | \emph{Oops.} 99 | Not all data structures have a last element. 100 | } 101 | 102 | %%%%%%%%%%%%%%%%% 103 | 104 | 105 | \framet{Vector as GADT}{ 106 | \begin{code} 107 | data Vec NOP :: Nat -> * -> * SPC where 108 | ZVec :: Vec Z a 109 | (:<) :: a -> Vec n a -> Vec (S n) a 110 | 111 | instance LScan (Vec Z) 112 | instance LScan (Vec n) => LScan (Vec (S n)) 113 | \end{code} 114 | \pause\vspace{-4ex} 115 | \begin{code} 116 | instance Generic1 (Vec Z) where 117 | type Rep1 (Vec Z) = U1 118 | from1 ZVec = U1 119 | to1 U1 = ZVec 120 | 121 | instance Generic1 (Vec (S n)) where 122 | type Rep1 (Vec (S n)) = Par1 :*: Vec n 123 | from1 (a :< as) = Par1 a :*: as 124 | to1 (Par1 a :*: as) = a :< as 125 | 126 | \end{code} 127 | 128 | Plus |Functor|, |Applicative|, |Foldable|, |Traversable|, |Monoid|, |Key|, \ldots. 129 | } 130 | 131 | \framet{Vector as type family}{ 132 | \begin{code} 133 | type family Vec_n where 134 | Vec Z = U1 135 | Vec (S n) = Par1 :*: Vec n 136 | \end{code} 137 | } 138 | 139 | \circuit{|Vec N8| (unoptimized)}{-1}{lsums-rv8-no-hash-no-opt}{36}{8} 140 | \circuit{|Vec N8| (optimized)}{-1}{lsums-rv8}{28}{7} 141 | 142 | 143 | \circuit{$8$}{0}{lsums-lv8}{7}{7} 144 | \circuit{$16$}{0}{lsums-lv16}{15}{15} 145 | \circuit{$8+8$}{0}{lsums-p-lv8}{22}{8} 146 | 147 | \circuit{$(5+11)$ (unoptimized)}{1}{lsums-lv5xlv11-no-hash-no-opt}{25}{11} 148 | \circuit{$(5+11)$ (optimized)}{1}{lsums-lv5xlv11}{25}{11} 149 | 150 | 151 | \circuit{$8+8$}{0}{lsums-p-lv8}{22}{8} 152 | \circuit{$2 \times 8$}{0}{lsums-p-lv8}{22}{8} 153 | 154 | %%%% 155 | 156 | \circuit{Products: $a^{m+n} = a^m \times a^n$}{0}{lsums-lv16}{15}{15} 157 | 158 | \framet{Divide and conquer? \hfill \stats {14}{7}\hspace{2ex}}{ 159 | \vspace{-2ex} 160 | \wfig{4.5in}{circuits/lsums-lv8-wide} 161 | \vspace{-5ex} 162 | \wfig{4.5in}{circuits/lsums-lv8-wide} 163 | \vspace{-4ex} 164 | \emph{Then what?} 165 | } 166 | 167 | \circuit{Divide and conquer?}{0}{lsums-lv8-lv8-unknown-no-hash}{14+?}{7+?} 168 | 169 | \circuit{Divide and conquer}{0}{lsums-p-lv8}{22}{8} 170 | 171 | 172 | %if False 173 | \framet{Divide and conquer?}{ 174 | \vspace{-2ex} 175 | \wfig{2.2in}{circuits/lsums-lv5} 176 | \vspace{-5ex} 177 | \wfig{4.5in}{circuits/lsums-lv11} 178 | 179 | \emph{Then what?} 180 | } 181 | 182 | \circuit{Divide and conquer?}{0}{lsums-lv5-lv11-unknown-no-hash}{14+?}{7+?} 183 | %endif 184 | \circuit{Divide and conquer --- unequal}{0}{lsums-lv5xlv11}{25}{11} 185 | 186 | 187 | \framet{Some simple scans}{ 188 | \vspace{-1ex} 189 | \begin{center} 190 | \ccap{|U1|}{1.2in}{lsums-u} 191 | \ccap{|Par1|}{1in}{lsums-i} 192 | \end{center} 193 | \pause 194 | \begin{center} 195 | \ccap{|Par1 :*: U1|}{1.4in}{lsums-1-0-no-hash-no-opt} 196 | \ccap{|Par1 :*: U1| (optimized)}{1in}{lsums-1-0} 197 | \end{center} 198 | \pause 199 | \begin{center} 200 | \ccap{|Par1 :*: (Par1 :*: U1)|}{1.5in}{lsums-1-1-0-no-hash-no-opt} 201 | \ccap{|Par1 :*: (Par1 :*: U1)| (optimized)}{1.3in}{lsums-1-1-0} 202 | \end{center} 203 | } 204 | 205 | \framet{|Par1 :*: (Par1 :*: (Par1 :*: (Par1 :*: U1)))| (unoptimized)}{ 206 | \vspace{0ex} 207 | \wfig{4.5in}{circuits/lsums-1-1-1-1-0-r-no-hash-no-opt} 208 | } 209 | \circuit{$1+(1+(1+(1+0)))$ (unoptimized)}{0}{lsums-1-1-1-1-0-r-no-hash-no-opt}{10}{4} 210 | \circuit{$1+(1+(1+(1+0)))$ (optimized)}{0}{lsums-1-1-1-1-0-r}{6}{3} 211 | 212 | \circuit{$(((0+1)+1)+1)+1$ (unoptimized)}{1}{lsums-0-1-1-1-1-l-no-hash-no-opt}{8}{4} 213 | \circuit{$(((0+1)+1)+1)+1$ (optimized)}{1}{lsums-0-1-1-1-1-l}{3}{3} 214 | 215 | 216 | \circuit{$8$}{0}{lsums-lv8}{7}{7} 217 | \circuit{$16$}{0}{lsums-lv16}{15}{15} 218 | \circuit{$5+(5+6)$}{-1}{lsums-lv5-5-6-r}{30}{7} 219 | -------------------------------------------------------------------------------- /Figures/circuits/scanAdd-rb3.dot: -------------------------------------------------------------------------------- 1 | digraph scanAdd_rb3 { 2 | margin=0; 3 | rankdir=LR; 4 | node [shape=Mrecord]; 5 | bgcolor=transparent; 6 | nslimit=20; 7 | ranksep="1.7"; 8 | c1 [label="{In|{|||||||||||||||}}"]; 9 | c2 [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 | c14 [label="{{|}|\∧|{}}"]; 20 | c16 [label="{{|}|\∧|{}}"]; 21 | c17 [label="{{|}|\∧|{}}"]; 22 | c19 [label="{{|}|\∧|{}}"]; 23 | c20 [label="{{|}|\∧|{}}"]; 24 | c21 [label="{{|}|\∧|{}}"]; 25 | c22 [label="{{|}|\∧|{}}"]; 26 | c23 [label="{{|}|\∧|{}}"]; 27 | c24 [label="{{|}|\∧|{}}"]; 28 | c26 [label="{{|}|\∧|{}}"]; 29 | c27 [label="{{|}|\∧|{}}"]; 30 | c28 [label="{{|}|\∧|{}}"]; 31 | c29 [label="{{|}|\∧|{}}"]; 32 | c30 [label="{{|}|\∧|{}}"]; 33 | c31 [label="{{|}|\∧|{}}"]; 34 | c33 [label="{{|}|\∧|{}}"]; 35 | c36 [label="{{|}|\∨|{}}"]; 36 | c37 [label="{{|}|\∨|{}}"]; 37 | c38 [label="{{|}|\∨|{}}"]; 38 | c39 [label="{{|}|\∨|{}}"]; 39 | c40 [label="{{|}|\∨|{}}"]; 40 | c41 [label="{{|}|\∨|{}}"]; 41 | c42 [label="{{|}|\∨|{}}"]; 42 | c43 [label="{{|}|\∨|{}}"]; 43 | c44 [label="{{|}|\∨|{}}"]; 44 | c45 [label="{{|}|\∨|{}}"]; 45 | c46 [label="{{|}|\∨|{}}"]; 46 | c47 [label="{{|}|\∨|{}}"]; 47 | c48 [label="{{|}|\⊕|{}}"]; 48 | c49 [label="{{|}|\⊕|{}}"]; 49 | c50 [label="{{|}|\⊕|{}}"]; 50 | c51 [label="{{|}|\⊕|{}}"]; 51 | c52 [label="{{|}|\⊕|{}}"]; 52 | c53 [label="{{|}|\⊕|{}}"]; 53 | c54 [label="{{|}|\⊕|{}}"]; 54 | c55 [label="{{|}|\⊕|{}}"]; 55 | c56 [label="{{|}|\⊕|{}}"]; 56 | c57 [label="{{|}|\⊕|{}}"]; 57 | c58 [label="{{|}|\⊕|{}}"]; 58 | c59 [label="{{|}|\⊕|{}}"]; 59 | c60 [label="{{|}|\⊕|{}}"]; 60 | c61 [label="{{|}|\⊕|{}}"]; 61 | c62 [label="{{|}|\⊕|{}}"]; 62 | c48:Out0 -> c2:In0 []; 63 | c56:Out0 -> c2:In1 []; 64 | c57:Out0 -> c2:In2 []; 65 | c58:Out0 -> c2:In3 []; 66 | c59:Out0 -> c2:In4 []; 67 | c60:Out0 -> c2:In5 []; 68 | c61:Out0 -> c2:In6 []; 69 | c62:Out0 -> c2:In7 []; 70 | c46:Out0 -> c2:In8 []; 71 | c1:Out0 -> c4:In0 []; 72 | c1:Out1 -> c4:In1 []; 73 | c1:Out2 -> c5:In0 []; 74 | c1:Out3 -> c5:In1 []; 75 | c1:Out4 -> c6:In0 []; 76 | c1:Out5 -> c6:In1 []; 77 | c1:Out6 -> c7:In0 []; 78 | c1:Out7 -> c7:In1 []; 79 | c1:Out8 -> c8:In0 []; 80 | c1:Out9 -> c8:In1 []; 81 | c1:Out10 -> c9:In0 []; 82 | c1:Out11 -> c9:In1 []; 83 | c1:Out12 -> c10:In0 []; 84 | c1:Out13 -> c10:In1 []; 85 | c1:Out14 -> c11:In0 []; 86 | c1:Out15 -> c11:In1 []; 87 | c4:Out0 -> c12:In0 []; 88 | c49:Out0 -> c12:In1 []; 89 | c6:Out0 -> c14:In0 []; 90 | c51:Out0 -> c14:In1 []; 91 | c51:Out0 -> c16:In0 []; 92 | c50:Out0 -> c16:In1 []; 93 | c8:Out0 -> c17:In0 []; 94 | c53:Out0 -> c17:In1 []; 95 | c53:Out0 -> c19:In0 []; 96 | c52:Out0 -> c19:In1 []; 97 | c10:Out0 -> c20:In0 []; 98 | c55:Out0 -> c20:In1 []; 99 | c54:Out0 -> c21:In0 []; 100 | c19:Out0 -> c21:In1 []; 101 | c55:Out0 -> c22:In0 []; 102 | c54:Out0 -> c22:In1 []; 103 | c36:Out0 -> c23:In0 []; 104 | c50:Out0 -> c23:In1 []; 105 | c36:Out0 -> c24:In0 []; 106 | c16:Out0 -> c24:In1 []; 107 | c43:Out0 -> c26:In0 []; 108 | c52:Out0 -> c26:In1 []; 109 | c43:Out0 -> c27:In0 []; 110 | c19:Out0 -> c27:In1 []; 111 | c43:Out0 -> c28:In0 []; 112 | c33:Out0 -> c28:In1 []; 113 | c43:Out0 -> c29:In0 []; 114 | c21:Out0 -> c29:In1 []; 115 | c40:Out0 -> c30:In0 []; 116 | c54:Out0 -> c30:In1 []; 117 | c40:Out0 -> c31:In0 []; 118 | c22:Out0 -> c31:In1 []; 119 | c22:Out0 -> c33:In0 []; 120 | c19:Out0 -> c33:In1 []; 121 | c5:Out0 -> c36:In0 []; 122 | c12:Out0 -> c36:In1 []; 123 | c6:Out0 -> c37:In0 []; 124 | c23:Out0 -> c37:In1 []; 125 | c7:Out0 -> c38:In0 []; 126 | c14:Out0 -> c38:In1 []; 127 | c8:Out0 -> c39:In0 []; 128 | c26:Out0 -> c39:In1 []; 129 | c9:Out0 -> c40:In0 []; 130 | c17:Out0 -> c40:In1 []; 131 | c10:Out0 -> c41:In0 []; 132 | c30:Out0 -> c41:In1 []; 133 | c11:Out0 -> c42:In0 []; 134 | c20:Out0 -> c42:In1 []; 135 | c38:Out0 -> c43:In0 []; 136 | c24:Out0 -> c43:In1 []; 137 | c40:Out0 -> c44:In0 []; 138 | c27:Out0 -> c44:In1 []; 139 | c42:Out0 -> c45:In0 []; 140 | c31:Out0 -> c45:In1 []; 141 | c45:Out0 -> c46:In0 []; 142 | c28:Out0 -> c46:In1 []; 143 | c41:Out0 -> c47:In0 []; 144 | c29:Out0 -> c47:In1 []; 145 | c1:Out0 -> c48:In0 []; 146 | c1:Out1 -> c48:In1 []; 147 | c1:Out2 -> c49:In0 []; 148 | c1:Out3 -> c49:In1 []; 149 | c1:Out4 -> c50:In0 []; 150 | c1:Out5 -> c50:In1 []; 151 | c1:Out6 -> c51:In0 []; 152 | c1:Out7 -> c51:In1 []; 153 | c1:Out8 -> c52:In0 []; 154 | c1:Out9 -> c52:In1 []; 155 | c1:Out10 -> c53:In0 []; 156 | c1:Out11 -> c53:In1 []; 157 | c1:Out12 -> c54:In0 []; 158 | c1:Out13 -> c54:In1 []; 159 | c1:Out14 -> c55:In0 []; 160 | c1:Out15 -> c55:In1 []; 161 | c49:Out0 -> c56:In0 []; 162 | c4:Out0 -> c56:In1 []; 163 | c50:Out0 -> c57:In0 []; 164 | c36:Out0 -> c57:In1 []; 165 | c51:Out0 -> c58:In0 []; 166 | c37:Out0 -> c58:In1 []; 167 | c52:Out0 -> c59:In0 []; 168 | c43:Out0 -> c59:In1 []; 169 | c53:Out0 -> c60:In0 []; 170 | c39:Out0 -> c60:In1 []; 171 | c54:Out0 -> c61:In0 []; 172 | c44:Out0 -> c61:In1 []; 173 | c55:Out0 -> c62:In0 []; 174 | c47:Out0 -> c62:In1 []; 175 | } 176 | 177 | // scanAdd-rb3 components: 25 ∧, 12 ∨, 15 ⊕, 52 total. Max depth: 8. 178 | --------------------------------------------------------------------------------