Add / update TODOs.
[matthijs/master-project/report.git] / Chapters / Normalization.tex
index f1b53dfa7bc681969763e478045cec681ca62b09..f2d0fbba13be843158d19e4644604ccb6c07d307 100644 (file)
@@ -7,9 +7,9 @@
   % space at the start of the frame.
   \define[1]\example{
     \framed[offset=1mm,align=right,strut=no,background=box,frame=off]{
   % space at the start of the frame.
   \define[1]\example{
     \framed[offset=1mm,align=right,strut=no,background=box,frame=off]{
-      \setuptyping[option=LAM,style=sans,before=,after=]
+      \setuptyping[option=LAM,style=sans,before=,after=,strip=auto]
       \typebuffer[#1]
       \typebuffer[#1]
-      \setuptyping[option=none,style=\tttf]
+      \setuptyping[option=none,style=\tttf,strip=auto]
     }
   }
 
     }
   }
 
         Since its exact role and need is not clear yet, this transformation is
         not yet specified.
 
         Since its exact role and need is not clear yet, this transformation is
         not yet specified.
 
-      \subsubsection{Compiler generated top level binding inlining}
-        TODO
+        TODO: Cast propagation
+
+      \subsubsection{Top level binding inlining}
+        This transform takes simple top level bindings generated by the
+        \small{GHC} compiler. \small{GHC} sometimes generates very simple
+        \quote{wrapper} bindings, which are bound to just a variable
+        reference, or a partial application to constants or other variable
+        references.
+
+        Note that this transformation is completely optional. It is not
+        required to get any function into normal form, but it does help making
+        the resulting VHDL output easier to read (since it removes a bunch of
+        components that are really boring).
+
+        This transform takes any top level binding generated by the compiler,
+        whose normalized form contains only a single let binding.
+
+        \starttrans
+        x = λa0 ... λan.let y = E in y
+        ~
+        x
+        --------------------------------------         \lam{x} is generated by the compiler
+        λa0 ... λan.let y = E in y
+        \stoptrans
+
+        \startbuffer[from]
+        (+) :: Word -> Word -> Word
+        (+) = GHC.Num.(+) @Word $dNum
+        ~
+        (+) a b
+        \stopbuffer
+        \startbuffer[to]
+        GHC.Num.(+) @ Alu.Word $dNum a b
+        \stopbuffer
+
+        \transexample{Top level binding inlining}{from}{to}
+       
+        Without this transformation, the (+) function would generate an
+        architecture which would just add its inputs. This generates a lot of
+        overhead in the VHDL, which is particularly annoying when browsing the
+        generated RTL schematic (especially since + is not allowed in VHDL
+        architecture names\footnote{Technically, it is allowed to use
+        non-alphanumerics when using extended identifiers, but it seems that
+        none of the tooling likes extended identifiers in filenames, so it
+        effectively doesn't work}, so the entity would be called
+        \quote{w7aA7f} or something similarly unreadable and autogenerated).
 
     \subsection{Program structure}
       These transformations are aimed at normalizing the overall structure
 
     \subsection{Program structure}
       These transformations are aimed at normalizing the overall structure
 
         \starttrans
         (letrec binds in E) M
 
         \starttrans
         (letrec binds in E) M
-        -----------------
+        ------------------------
         letrec binds in E M
         \stoptrans
 
         letrec binds in E M
         \stoptrans
 
         Note that \lam{x0} and {x1} will still need normalization after this.
 
       \subsubsection{Argument propagation}
         Note that \lam{x0} and {x1} will still need normalization after this.
 
       \subsubsection{Argument propagation}
+        TODO: Generalize this section into specialization, so other
+        transformations can refer to this (since specialization is really used
+        in multiple categories).
+
         This transform deals with arguments to user-defined functions that are
         not representable at runtime. This means these arguments cannot be
         preserved in the final form and most be {\em propagated}.
         This transform deals with arguments to user-defined functions that are
         not representable at runtime. This means these arguments cannot be
         preserved in the final form and most be {\em propagated}.