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

SCM Repository

[diderot] Diff of /branches/pure-cfg/src/compiler/c-target/c-target.sml
ViewVC logotype

Diff of /branches/pure-cfg/src/compiler/c-target/c-target.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 653, Mon Mar 21 00:31:29 2011 UTC revision 654, Mon Mar 21 17:10:54 2011 UTC
# Line 24  Line 24 
24          name : string,          name : string,
25          tyName : string,          tyName : string,
26          state : var list ref,          state : var list ref,
27            output : var option ref,        (* the strand's output variable (only one for now) *)
28          code : CL.decl list ref          code : CL.decl list ref
29        }        }
30    
# Line 241  Line 242 
242          val selF = sel (RN.gRealSuffix, "r", T_Real)          val selF = sel (RN.gRealSuffix, "r", T_Real)
243          val selI = sel (RN.gIntSuffix, "i", T_Int)          val selI = sel (RN.gIntSuffix, "i", T_Int)
244          in          in
245            fun ivecIndex (e, d, i) = let val E(e', _) = selI(i, e, d) in e' end
246            fun vecIndex (e, d, i) = let val E(e', _) = selF(i, e, d) in e' end
247          fun select (i, E(e, T_Vec n)) = selF (i, e, n)          fun select (i, E(e, T_Vec n)) = selF (i, e, n)
248            | select (i, E(e, T_IVec n)) = selI (i, e, n)            | select (i, E(e, T_IVec n)) = selI (i, e, n)
249            | select (_, x) = invalid("select", [x])            | select (_, x) = invalid("select", [x])
# Line 479  Line 482 
482                        name = name,                        name = name,
483                        tyName = RN.strandTy name,                        tyName = RN.strandTy name,
484                        state = ref [],                        state = ref [],
485                          output = ref NONE,
486                        code = ref []                        code = ref []
487                      }                      }
488                in                in
# Line 509  Line 513 
513                        CL.PARAM([], CL.T_Ptr(CL.T_Named tyName), "selfIn"),                        CL.PARAM([], CL.T_Ptr(CL.T_Named tyName), "selfIn"),
514                        CL.PARAM([], CL.T_Ptr(CL.T_Named tyName), "selfOut")                        CL.PARAM([], CL.T_Ptr(CL.T_Named tyName), "selfOut")
515                      ]                      ]
516                val methFn = CL.D_Func([], CL.int32, fName, params, body)                val methFn = CL.D_Func(["static"], CL.int32, fName, params, body)
517                in                in
518                  code := methFn :: !code                  code := methFn :: !code
519                end                end
520    
521            fun output (Strand{output, ...}, x) = (case !output
522                   of NONE => output := SOME x
523                    | _ => raise Fail "multiple outputs are not supported yet"
524                  (* end case *))
525        end (* Strand *)        end (* Strand *)
526    
527      fun genStrand (Strand{name, tyName, state, code}) = let      fun genStrand (Strand{name, tyName, state, output, code}) = let
528          (* the type declaration for the strand's state struct *)          (* the type declaration for the strand's state struct *)
529            val selfTyDef = CL.D_StructDef(            val selfTyDef = CL.D_StructDef(
530                    List.rev (List.map (fn V(ty, x) => (cvtTy ty, x)) (!state)),                    List.rev (List.map (fn V(ty, x) => (cvtTy ty, x)) (!state)),
531                    tyName)                    tyName)
532            (* the print function *)
533              val prFnName = concat[name, "_print"]
534              val prFn = let
535                    val params = [
536                          CL.PARAM([], CL.T_Ptr(CL.T_Named "FILE"), "outS"),
537                          CL.PARAM([], CL.T_Ptr(CL.T_Named tyName), "self")
538                        ]
539                    val SOME(V(ty, x)) = !output
540                    val outState = CL.mkIndirect(CL.mkVar "self", x)
541                    val prArgs = (case ty
542                           of TargetTy.T_Int => [CL.E_Str(!RN.gIntFormat ^ "\n"), outState]
543                            | TargetTy.T_Real => [CL.E_Str "%f\n", outState]
544                            | TargetTy.T_Vec d => let
545                                val fmt = CL.E_Str(
546                                      String.concatWith " " (List.tabulate(d, fn _ => "%f"))
547                                      ^ "\n")
548                                val args = List.tabulate (d, fn i => Expr.ivecIndex(outState, d, i))
549                                in
550                                  fmt :: args
551                                end
552                            | TargetTy.T_IVec d => let
553                                val fmt = CL.E_Str(
554                                      String.concatWith " " (List.tabulate(d, fn _ => !RN.gIntFormat))
555                                      ^ "\n")
556                                val args = List.tabulate (d, fn i => Expr.vecIndex(outState, d, i))
557                                in
558                                  fmt :: args
559                                end
560                            | _ => raise Fail("genStrand: unsupported output type " ^ TargetTy.toString ty)
561                          (* end case *))
562                    in
563                      CL.D_Func(["static"], CL.voidTy, prFnName, params,
564                        CL.S_Call("fprintf", CL.mkVar "outS" :: prArgs))
565                    end
566          (* the strand's descriptor object *)          (* the strand's descriptor object *)
567            val descI = let            val descI = let
568                  fun fnPtr (ty, f) = CL.I_Exp(CL.mkCast(CL.T_Named ty, CL.mkVar f))                  fun fnPtr (ty, f) = CL.I_Exp(CL.mkCast(CL.T_Named ty, CL.mkVar f))
# Line 527  Line 570 
570                    CL.I_Struct[                    CL.I_Struct[
571                        ("name", CL.I_Exp(CL.E_Str name)),                        ("name", CL.I_Exp(CL.E_Str name)),
572                        ("stateSzb", CL.I_Exp(CL.mkSizeof(CL.T_Named(RN.strandTy name)))),                        ("stateSzb", CL.I_Exp(CL.mkSizeof(CL.T_Named(RN.strandTy name)))),
573                        ("update", fnPtr("update_method_t", name ^ "_update"))                        ("update", fnPtr("update_method_t", name ^ "_update")),
574                          ("print", fnPtr("print_method_t", prFnName))
575                      ]                      ]
576                  end                  end
577            val desc = CL.D_Var([], CL.T_Named RN.strandDescTy, RN.strandDesc name, SOME descI)            val desc = CL.D_Var([], CL.T_Named RN.strandDescTy, RN.strandDesc name, SOME descI)
578            in            in
579              selfTyDef :: List.rev (desc :: !code)              selfTyDef :: List.rev (desc :: prFn :: !code)
580            end            end
581    
582    (* generate the table of strand descriptors *)    (* generate the table of strand descriptors *)

Legend:
Removed from v.653  
changed lines
  Added in v.654

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