Support stateful functions with no own state (only substate).
[matthijs/master-project/cλash.git] / cλash / CLasH / VHDL / Generate.hs
index 1d8194d9455e386834362e610f15db322c0e73c7..a9947a2ddacc58508262976a4dfa723893c5e93f 100644 (file)
@@ -134,8 +134,14 @@ getArchitecture fname = makeCached fname tsArchitectures $ do
   (state_proc, resbndr) <- case (Maybe.catMaybes in_state_maybes, Maybe.catMaybes out_state_maybes, init_state) of
         ([in_state], [out_state], Nothing) -> do 
           nonEmpty <- hasNonEmptyType in_state
-          if nonEmpty then error ("No initial state defined for: " ++ show fname) else return ([],[])
-        ([in_state], [out_state], Just resetval) -> mkStateProcSm (in_state, out_state,resetval)
+          if nonEmpty 
+            then error ("No initial state defined for: " ++ show fname) 
+            else return ([],[])
+        ([in_state], [out_state], Just resetval) -> do
+          nonEmpty <- hasNonEmptyType in_state
+          if nonEmpty 
+            then mkStateProcSm (in_state, out_state, resetval)
+            else error ("Initial state defined for function with only substate: " ++ show fname)
         ([], [], Just _) -> error $ "Initial state defined for state-less function: " ++ show fname
         ([], [], Nothing) -> return ([],[])
         (ins, outs, res) -> error $ "Weird use of state in " ++ show fname ++ ". In: " ++ show ins ++ " Out: " ++ show outs
@@ -172,9 +178,13 @@ mkStateProcSm ::
 mkStateProcSm (old, new, res) = do
   let error_msg = "\nVHDL.mkSigDec: Can not make signal declaration for type: \n" ++ pprString res 
   type_mark_old_maybe <- MonadState.lift tsType $ vhdlTy error_msg (Var.varType old)
-  let type_mark_old = Maybe.fromJust type_mark_old_maybe
+  let type_mark_old = Maybe.fromMaybe 
+                        (error $ "\nGenerate.mkStateProcSm: empty type for state? Type: " ++ pprString (Var.varType old))
+                        type_mark_old_maybe
   type_mark_res_maybe <- MonadState.lift tsType $ vhdlTy error_msg (Var.varType res)
-  let type_mark_res' = Maybe.fromJust type_mark_res_maybe
+  let type_mark_res' = Maybe.fromMaybe 
+                        (error $ "\nGenerate.mkStateProcSm: empty type for initial state? Type: " ++ pprString (Var.varType res))
+                        type_mark_res_maybe
   let type_mark_res = if type_mark_old == type_mark_res' then
                         type_mark_res'
                       else