Copyright | (C) 2015-2016 University of Twente 2021-2024 QBayLogic B.V. 2022 LumiGuide Fietsdetectie B.V. |
---|---|

License | BSD2 (see the file LICENSE) |

Maintainer | QBayLogic B.V. <devops@qbaylogic.com> |

Safe Haskell | None |

Language | Haskell2010 |

The `disjointExpressionConsolidation`

transformation lifts applications of
global binders out of alternatives of case-statements.

e.g. It converts:

case x of A -> f 3 y B -> f x x C -> h x

into:

let f_arg0 = case x of {A -> 3; B -> x} f_arg1 = case x of {A -> y; B -> x} f_out = f f_arg0 f_arg1 in case x of A -> f_out B -> f_out C -> h x

## Synopsis

# Documentation

disjointExpressionConsolidation :: HasCallStack => NormRewrite Source #

This transformation lifts applications of global binders out of alternatives of case-statements.

e.g. It converts:

case x of A -> f 3 y B -> f x x C -> h x

into:

let f_arg0 = case x of {A -> 3; B -> x} f_arg1 = case x of {A -> y; B -> x} f_out = f f_arg0 f_arg1 in case x of A -> f_out B -> f_out C -> h x

Though that's a lie. It actually converts it into:

let f_tupIn = case x of {A -> (3,y); B -> (x,x)} f_arg0 = case f_tupIn of (l,_) -> l f_arg1 = case f_tupIn of (_,r) -> r f_out = f f_arg0 f_arg1 in case x of A -> f_out B -> f_out C -> h x

In order to share the expression that's in the subject of the case expression,
and to share the *decoder* circuit that logic synthesis will create to map the
bits of the subject expression to the bits needed to make the selection in the
multiplexer.