From 0fc98aec94208d539f33996f737066c8d981ac7d Mon Sep 17 00:00:00 2001
From: Hans-Peter Deifel <hpd@hpdeifel.de>
Date: Tue, 18 Oct 2016 08:50:14 +0200
Subject: [PATCH] Generate C for ISRs

---
 src/CFG/C.hs      |  8 +++++---
 test/CFG/CSpec.hs | 25 +++++++++++++++++++++++++
 2 files changed, 30 insertions(+), 3 deletions(-)

diff --git a/src/CFG/C.hs b/src/CFG/C.hs
index bf38d0f..3e4b981 100644
--- a/src/CFG/C.hs
+++ b/src/CFG/C.hs
@@ -35,19 +35,21 @@ compileToC fun =
   let instrs = instrsToC $ extract fun
       header KindSubtask = "TASK(" <> funName fun <> ")"
       header KindFunction = "void " <> funName fun <> "()"
+      header KindISR = "ISR2(" <> funName fun <> ")"
   in    header (funKind fun) <> " {\n"
      <> indent instrs
      <> "}\n"
 
 -- | Declare multiple functions
 generateDecls :: [Function a] -> Text
-generateDecls = T.unlines . map generateDecl
+generateDecls = mconcat . map generateDecl
 
 -- | Declare a function
 generateDecl :: Function a -> Text
 generateDecl fun = case funKind fun of
-  KindSubtask -> "DeclareTask(" <> funName fun <> ");"
-  KindFunction -> "void " <> funName fun <> "();"
+  KindSubtask  -> "DeclareTask(" <> funName fun <> ");\n"
+  KindFunction -> "void " <> funName fun <> "();\n"
+  KindISR      -> ""
 
 -- | Declare all used but undefined symbols as extern
 declareExtern :: [Function [Instr]] -> Text
diff --git a/test/CFG/CSpec.hs b/test/CFG/CSpec.hs
index e64ebf8..faa57bd 100644
--- a/test/CFG/CSpec.hs
+++ b/test/CFG/CSpec.hs
@@ -78,6 +78,12 @@ example1TaskC =
 example1TaskCDecl :: Text
 example1TaskCDecl = "DeclareTask(foo);\n"
 
+example1ISRC :: Text
+example1ISRC =
+     "ISR2(foo) {\n"
+  <> T.unlines (map ("  " <>) example1OutputLines)
+  <> "}\n"
+
 example2Function :: Function [Instr]
 example2Function = example1Function { funName = "bar" }
 
@@ -99,6 +105,12 @@ example2TaskC =
 example2TaskCDecl :: Text
 example2TaskCDecl = "DeclareTask(bar);\n"
 
+example2ISRC :: Text
+example2ISRC =
+     "ISR2(bar) {\n"
+  <> T.unlines (map ("  " <>) example1OutputLines)
+  <> "}\n"
+
 exampleExternDecls :: Text
 exampleExternDecls = "extern \"C\" {\nextern void syscall();\n}"
 
@@ -115,6 +127,9 @@ compileToCTest = describe "compileToC" $ do
   it "works with a task" $
     compileToC example1Function { funKind = KindSubtask } `shouldBe` example1TaskC
 
+  it "works with an isr" $
+    compileToC example1Function { funKind = KindISR } `shouldBe` example1ISRC
+
 include :: Text
 include = "#include <mockup_prelude.cc>"
 
@@ -148,6 +163,16 @@ compileToCAllTest = describe "compileToCAll" $ do
                  <> example2FunctionC <> "\n"
                  )
 
+  it "compiles one tasks and one ISR" $
+    compileToCAll [example1Function { funKind = KindSubtask },
+                   example2Function { funKind = KindISR }
+                  ]
+      `shouldBe` (  include <> "\n\n" <> exampleExternDecls <> "\n"
+                 <> example1TaskCDecl <> "\n"
+                 <> example1TaskC <> "\n"
+                 <> example2ISRC <> "\n"
+                 )
+
 
 declFunction1 :: Function [Instr]
 declFunction1 = Function
-- 
GitLab