Don't rotate alternatives when there is no default case and there are no binders
authorchristiaanb <christiaan.baaij@gmail.com>
Wed, 23 Jun 2010 16:11:00 +0000 (18:11 +0200)
committerchristiaanb <christiaan.baaij@gmail.com>
Wed, 23 Jun 2010 16:11:00 +0000 (18:11 +0200)
clash/CLasH/VHDL/Generate.hs

index df0991c39a25698fc656d6aa12dffa8f5a87d7fe..2fea7a3a38565a09866276b7b4a0a307e3fa01c7 100644 (file)
@@ -310,11 +310,12 @@ mkConcSm (bndr, expr@(CoreSyn.Case (CoreSyn.Var scrut) _ _ alts)) = do
   -- Compare the (constructor field of the) scrutinee with each of the
   -- alternatives.
   let cond_exprs = map (\x -> cmp AST.:=: x) altcons
   -- Compare the (constructor field of the) scrutinee with each of the
   -- alternatives.
   let cond_exprs = map (\x -> cmp AST.:=: x) altcons
-  -- Rotate expressions to the left, so that the expression related to the default case is the last
-  let alts' = case alts of
-                ((CoreSyn.DEFAULT,_,_):_) -> ((tail alts) ++ [head alts])
-                otherwise         -> alts
-  
+  -- Rotate expressions to the leftso that the expression related to the default case is the last
+  -- Does NOT apply when there is no DEFAULT case and there are no binders
+  let alts' = if ((any (\(_,x,_) -> not (null x)) alts) || ((\(x,_,_)->x) (head alts)) == CoreSyn.DEFAULT ) then
+                  ((tail alts) ++ [head alts])
+              else
+                  alts
   exprs <- MonadState.lift tsType $ mapM (varToVHDLExpr . (\(_,_,CoreSyn.Var expr) -> expr)) alts' --((tail alts) ++ [head alts])
   return ([mkAltsAssign (Left bndr) cond_exprs exprs], [])
 
   exprs <- MonadState.lift tsType $ mapM (varToVHDLExpr . (\(_,_,CoreSyn.Var expr) -> expr)) alts' --((tail alts) ++ [head alts])
   return ([mkAltsAssign (Left bndr) cond_exprs exprs], [])