@@ -28,8 +28,12 @@ import scala.collection.mutable.{Map => MutableMap, Set => MutableSet}
2828// Can we generate them from our Scala DSL?
2929
3030@ virtualize
31- trait GenExternal extends SymExeDefs with EngineBase {
32- def sym_exit [T : Manifest ](ss : Rep [SS ], args : Rep [List [Value ]]): Rep [T ] = ???
31+ trait GenExternal extends SymExeDefs {
32+ // TODO: generating functions with proper names, instead of x1, x2 ...
33+
34+ // TODO: sym_exit return type in C should be void
35+ def sym_exit [T : Manifest ](ss : Rep [SS ], args : Rep [List [Value ]]): Rep [T ] =
36+ " sym_exit" .reflectWith[T ](ss, args)
3337
3438 def gen_llsc_assert [T : Manifest ](ss : Rep [SS ], args : Rep [List [Value ]], k : (Rep [SS ], Rep [Value ]) => Rep [T ]): Rep [T ] = {
3539 val v = args(0 )
@@ -44,4 +48,49 @@ trait GenExternal extends SymExeDefs with EngineBase {
4448 else k(ss1, IntV (1 , 32 ))
4549 }
4650 }
51+
52+ def llsc_assert (ss : Rep [SS ], args : Rep [List [Value ]]): Rep [List [(SS , Value )]] =
53+ gen_llsc_assert[List [(SS , Value )]](ss, args, { case (s, v) => List [(SS , Value )]((s, v)) })
54+
55+ def llsc_assert_k (ss : Rep [SS ], args : Rep [List [Value ]], k : Rep [Cont ]): Rep [Unit ] =
56+ gen_llsc_assert[Unit ](ss, args, { case (s, v) => k(s, v) })
57+ }
58+
59+ class ExternalLLSCDriver (folder : String = " ." ) extends SAISnippet [Int , Unit ] with SAIOps with GenExternal { q =>
60+ import java .io .{File , PrintStream }
61+ import scala .collection .mutable .HashMap
62+
63+ val funNameMap : HashMap [Int , String ] = new HashMap ()
64+ val blockNameMap : HashMap [Int , String ] = new HashMap ()
65+
66+ val codegen : GenericLLSCCodeGen = new GenericLLSCCodeGen {
67+ val codegenFolder : String = folder
68+ def funMap : HashMap [Int , String ] = funNameMap
69+ def blockMap : HashMap [Int , String ] = blockNameMap
70+ override def emitAll (g : Graph , name : String )(m1 : Manifest [_], m2 : Manifest [_]): Unit = {
71+ val ng = init(g)
72+ run(name, ng)
73+ emitln(" /* LLSC - External utility functions and library modeling functions */" )
74+ emitFunctions(stream)
75+ }
76+ }
77+
78+ def genHeader : Unit = {
79+ val mainStream = new PrintStream (s " $folder/external.hpp " )
80+ val statics = Adapter .emitCommon1(" header" , codegen, mainStream)(manifest[Int ], manifest[Unit ])(x => Unwrap (wrapper(Wrap [Int ](x))))
81+ mainStream.close
82+ }
83+
84+ def snippet (u : Rep [Int ]) = {
85+ hardTopFun(llsc_assert(_, _))
86+ hardTopFun(llsc_assert_k(_, _, _))
87+ ()
88+ }
89+ }
90+
91+ object TestGenerateExternal {
92+ def main (args : Array [String ]): Unit = {
93+ val code = new ExternalLLSCDriver
94+ code.genHeader
95+ }
4796}
0 commit comments