Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Annotation of /branches/vis15/src/compiler/target-cpu/gen-strand.sml
ViewVC logotype

Annotation of /branches/vis15/src/compiler/target-cpu/gen-strand.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3952 - (view) (download)

1 : jhr 3864 (* gen-strand.sml
2 :     *
3 :     * Code generation for strands
4 :     *
5 :     * This code is part of the Diderot Project (http://diderot-language.cs.uchicago.edu)
6 :     *
7 :     * COPYRIGHT (c) 2016 The University of Chicago
8 :     * All rights reserved.
9 :     *)
10 :    
11 :     structure GenStrand : sig
12 :    
13 : jhr 3918 val gen : CodeGenEnv.t * TreeIR.strand -> {
14 :     structDef : CLang.decl,
15 :     methods : CLang.decl list
16 :     }
17 : jhr 3864
18 :     end = struct
19 :    
20 :     structure IR = TreeIR
21 : jhr 3924 structure SV = TreeStateVar
22 : jhr 3864 structure CL = CLang
23 : jhr 3908 structure RN = CxxNames
24 :     structure Env = CodeGenEnv
25 : jhr 3864
26 : jhr 3917 val strandStatusTy = CL.T_Named "diderot::strand_status"
27 :    
28 :     (* generate the strand-state struct declaration *)
29 :     fun genStrandStruct (env, strandName, state) = let
30 : jhr 3924 fun mkField sv = (TreeToCxx.trType(env, SV.ty sv), SV.qname sv)
31 : jhr 3917 in
32 :     CL.D_StructDef(SOME(strandName ^ "_strand"), List.map mkField state, NONE)
33 :     end
34 :    
35 : jhr 3866 (* generate the strand-state initialization code. The variables are the strand
36 :     * parameters.
37 :     *)
38 : jhr 3952 fun genStateInit (env, strandName, strandTy, params, def) = let
39 :     val IR.Method{usesGlobals, needsWorld, body} = def
40 : jhr 3866 val fName = strandName ^ "_init"
41 : jhr 3927 val (env, params) = List.foldr
42 :     (fn (x, (env, ps)) => let
43 :     val (env, p) = TreeToCxx.trParam(env, x)
44 :     in
45 :     (env, p::ps)
46 :     end)
47 :     (env, []) params
48 : jhr 3908 val selfParam = if TargetSpec.dualState(Env.target env)
49 :     then RN.selfOutVar
50 :     else RN.selfVar
51 : jhr 3866 val params =
52 : jhr 3917 CL.PARAM([], strandTy, selfParam) :: params
53 : jhr 3952 val params = if usesGlobals
54 : jhr 3908 then RN.globalsParam :: params
55 : jhr 3866 else params
56 : jhr 3952 val params = if needsWorld
57 :     then RN.worldParam :: params
58 :     else params
59 : jhr 3908 val body = TreeToCxx.trBlock (env, body)
60 : jhr 3866 in
61 :     CL.D_Func(["static"], CL.voidTy, fName, params, body)
62 :     end
63 :    
64 : jhr 3864 (* generate a function definition for a strand method *)
65 : jhr 3952 fun genMethodDef (env, strandName, strandTy, methTy, methName, usesGlobals, needsWorld, body) = let
66 : jhr 3864 val fName = concat[strandName, "_", methName]
67 : jhr 3908 val stateParams = if TargetSpec.dualState(Env.target env)
68 : jhr 3864 then [
69 : jhr 3908 CL.PARAM(["const"], strandTy, RN.selfVar),
70 :     CL.PARAM([], strandTy, RN.selfOutVar)
71 : jhr 3864 ]
72 : jhr 3908 else [CL.PARAM([], strandTy, RN.selfVar)]
73 : jhr 3952 val params = if usesGlobals
74 : jhr 3908 then RN.globalsParam :: stateParams
75 : jhr 3864 else stateParams
76 : jhr 3952 val params = if needsWorld
77 :     then RN.worldParam :: stateParams
78 :     else stateParams
79 : jhr 3864 in
80 : jhr 3917 CL.D_Func(["static"], methTy, fName, params, body)
81 : jhr 3864 end
82 :    
83 : jhr 3924 (* generate a function definition for a strand method *)
84 : jhr 3952 fun genMethod (env, strandName, strandTy, methTy, methName, IR.Method{usesGlobals, needsWorld, body}) =
85 :     genMethodDef (
86 :     env, strandName, strandTy, methTy, methName,
87 :     usesGlobals, needsWorld, TreeToCxx.trBlock (env, body))
88 : jhr 3924
89 : jhr 3908 fun genInitiallyMethod (_, _, _, NONE) = []
90 : jhr 3952 | genInitiallyMethod (env, strandName, strandTy, SOME meth) =
91 :     [genMethod (env, strandName, strandTy, strandStatusTy, "initially", meth)]
92 : jhr 3864
93 : jhr 3952 fun genUpdateMethod (env, strandName, strandTy, meth) =
94 :     genMethod (env, strandName, strandTy, strandStatusTy, "update", meth)
95 : jhr 3864
96 : jhr 3924 fun genStabilizeMethod (env, strandName, strandTy, NONE) =
97 :     if TargetSpec.dualState(Env.target env)
98 :     then raise Fail "FIXME: default stabilize for dual state"
99 : jhr 3952 else [
100 :     genMethodDef (
101 :     env, strandName, strandTy, CL.voidTy, "stabilize", false, false, CL.mkBlock[])
102 :     ]
103 :     | genStabilizeMethod (env, strandName, strandTy, SOME meth) =
104 :     [genMethod (env, strandName, strandTy, CL.voidTy, "stabilize", meth)]
105 : jhr 3864
106 : jhr 3908 fun gen (env, strand) = let
107 : jhr 3864 val IR.Strand{name, params, state, stateInit, initM, updateM, stabilizeM} = strand
108 : jhr 3907 val name = Atom.toString name
109 : jhr 3908 val strandTy = CL.T_Ptr(CL.T_Named(name ^ "_strand"))
110 : jhr 3918 in {
111 :     structDef = genStrandStruct (env, name, state),
112 :     methods = genStateInit (env, name, strandTy, params, stateInit) ::
113 :     genInitiallyMethod (env, name, strandTy, initM) @
114 :     genUpdateMethod (env, name, strandTy, updateM) ::
115 :     genStabilizeMethod (env, name, strandTy, stabilizeM)
116 :     } end
117 : jhr 3864
118 :     end

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0