(like \lam{map}). The graphical version of the architecture contains
a slightly simplified version, since the state tuple packing and
unpacking have been left out. Instead, two separate registers are
- drawn. Also note that most synthesis tools will further optimize
- this architecture by removing the multiplexers at the register input
- and instead put some gates in front of the register's clock input,
- but we want to show the architecture as close to the description as
- possible.
+ drawn. Most synthesis tools will further optimize this architecture by
+ removing the multiplexers at the register input and instead use the write
+ enable port of the register (when it is available), but we want to show
+ the architecture as close to the description as possible.
As you can see from the previous examples, the generation of the final
architecture from the normal form is straightforward. In each of the
\subsubsection[sec:normalization:defunctionalization]{Defunctionalization}
These transformations remove higher-order expressions from our
- program, making all values first-order.
+ program, making all values first-order. The approach used for
+ defunctionalization uses a combination of specialization, inlining and
+ some cleanup transformations, was also proposed in parallel research
+ by Neil Mitchell \cite[mitchell09].
Higher order values are always introduced by lambda abstractions, none
of the other Core expression elements can introduce a function type.
publisher = {Kluwer Academic Publishers},
address = {Hingham, MA, USA},
}
+
+@inproceedings{mitchell09,
+ author = {Mitchell, Neil and Runciman, Colin},
+ title = {Losing functions without gaining data: another look at defunctionalisation},
+ booktitle = {Haskell '09: Proceedings of the 2nd ACM SIGPLAN symposium on Haskell},
+ year = {2009},
+ isbn = {978-1-60558-508-6},
+ pages = {13--24},
+ location = {Edinburgh, Scotland},
+ doi = {http://doi.acm.org/10.1145/1596638.1596641},
+ publisher = {ACM},
+ address = {New York, NY, USA},
+}