Metacircularity in the polymorphic &lgr;-calculus
TAPSOFT '89 2nd international joint conference on Theory and practice of software development
Two-level functional languages
Two-level functional languages
Multi-stage programming with explicit annotations
PEPM '97 Proceedings of the 1997 ACM SIGPLAN symposium on Partial evaluation and semantics-based program manipulation
Lava: hardware design in Haskell
ICFP '98 Proceedings of the third ACM SIGPLAN international conference on Functional programming
ICFP '00 Proceedings of the fifth ACM SIGPLAN international conference on Functional programming
Communications of the ACM
POPL '03 Proceedings of the 30th ACM SIGPLAN-SIGACT symposium on Principles of programming languages
Inductively Defined Types in the Calculus of Constructions
Proceedings of the 5th International Conference on Mathematical Foundations of Programming Semantics
The Design of a Pretty-printing Library
Advanced Functional Programming, First International Spring School on Advanced Functional Programming Techniques-Tutorial Text
Decomposing Typed Lambda Calculus into a Couple of Categorical Programming Languages
CTCS '95 Proceedings of the 6th International Conference on Category Theory and Computer Science
Observable Sharing for Functional Circuit Description
ASIAN '99 Proceedings of the 5th Asian Computing Science Conference on Advances in Computing Science
muFP, a language for VLSI design
LFP '84 Proceedings of the 1984 ACM Symposium on LISP and functional programming
Microprocessor Specification in Hawk
ICCL '98 Proceedings of the 1998 International Conference on Computer Languages
A reflective functional language for hardware design and theorem proving
Journal of Functional Programming
Type-safe observable sharing in Haskell
Proceedings of the 2nd ACM SIGPLAN symposium on Haskell
IFL'09 Proceedings of the 21st international conference on Implementation and application of functional languages
Synchronous digital circuits as functional programs
ACM Computing Surveys (CSUR)
Hi-index | 0.00 |
Ordinarily, a compiler for a multi-level language will contain some knowledge of the object language; for example, in a multi-stage programming language with runtime code generation, the compiler will know how to produce code which emits machine code for object language expressions. This means that adding, extending, or replacing the object language requires knowledge of compiler internals. Generalized arrows act as an intermediate language, separating the meta language compiler from the object language implementation. Two-level expressions are flattened [11] into ordinary one-level expressions polymorphic in an instance of the GArrow class, which is used to represent object language expressions. Operations on object language expressions are then packaged in an instance of the GArrow class, which is a library rather than part of the compiler. This paper presents an example application of this approach: a bit-serial circuit which searches for SHA-256 hash collisions. A two-level circuit-building program is passed through the GHC flattening pass (which is not specific to hardware design in any way) and the resulting one-level program is combined with a GArrow instance that emits Verilog code; this instance is an ordinary Haskell library which can be written without knowledge of compiler internals.