X-Git-Url: http://plrg.eecs.uci.edu/git/?p=cdsspec-compiler.git;a=blobdiff_plain;f=src%2Fedu%2Fuci%2Feecs%2FspecCompiler%2FcodeGenerator%2FCodeVariables.java;h=3d4583d37cd5198f870c27df7b4462087233666b;hp=cdc8771fdf5ed5cdbb15663e28d54025353d3dba;hb=248ddcf2c82a0dd08539935b7c4a9db4adc097e1;hpb=a0721aba5feb313cce48120d4e98e0165bb476bc diff --git a/src/edu/uci/eecs/specCompiler/codeGenerator/CodeVariables.java b/src/edu/uci/eecs/specCompiler/codeGenerator/CodeVariables.java index cdc8771..3d4583d 100644 --- a/src/edu/uci/eecs/specCompiler/codeGenerator/CodeVariables.java +++ b/src/edu/uci/eecs/specCompiler/codeGenerator/CodeVariables.java @@ -21,9 +21,12 @@ import edu.uci.eecs.specCompiler.specExtraction.SequentialDefineSubConstruct; import edu.uci.eecs.specCompiler.specExtraction.VariableDeclaration; /** - *

Defines a list of commonly used constant strings.

+ *

+ * Defines a list of commonly used constant strings. + *

+ * * @author peizhaoo - * + * */ public class CodeVariables { // C++ code or library @@ -416,6 +419,22 @@ public class CodeVariables { newCode.add("static " + DECLARE(ANNO_HB_INIT + "**", "hb_init_table")); newCode.add(""); + + // Define the __SPEC_INIT__ function to initialize user-defined + // variables + newCode.add(COMMENT("Initialization of sequential varialbes")); + newCode.add("static void __SPEC_INIT__() {"); + addAllCodeWithIndent(newCode, construct.code.initVar, "\t"); + newCode.add("}"); + newCode.add(""); + + // Define the __SPEC_CLEAN__ function for clean-up + newCode.add(COMMENT("Cleanup routine of sequential variables")); + newCode.add("static void __SPEC_CLEANUP__() {"); + addAllCodeWithIndent(newCode, construct.code.cleanupCode, "\t"); + newCode.add("}"); + newCode.add(""); + newCode.add(COMMENT("Define function for sequential code initialization")); newCode.add("inline static void __sequential_init() {"); // Init func_ptr_table @@ -441,6 +460,10 @@ public class CodeVariables { + COMMENT("Pass init info, including function table info & HB rules")); String structName = "anno_init", anno = "init"; newCode.add("\t" + STRUCT_NEW_DECLARE_DEFINE(ANNO_INIT, structName)); + newCode.add("\t" + + ASSIGN_TO_PTR(structName, "init_func", "(void*) __SPEC_INIT__")); + newCode.add("\t" + + ASSIGN_TO_PTR(structName, "cleanup_func", "(void*) __SPEC_CLEANUP__")); newCode.add("\t" + ASSIGN_TO_PTR(structName, "func_table", "func_ptr_table")); newCode.add("\t" @@ -456,10 +479,9 @@ public class CodeVariables { newCode.add("\t" + ANNOTATE(semantics, anno)); newCode.add(""); - // Init user-defined variables - addAllCodeWithIndent(newCode, construct.code.initVar, "\t"); - newCode.add("}"); + newCode.add(""); + newCode.add(COMMENT("End of Global construct generation in class")); // printCode(newCode); @@ -597,7 +619,9 @@ public class CodeVariables { newCode.add("\t" + ASSIGN_TO_PTR(structName, "interface_num", interfaceNum) + SHORT_COMMENT(construct.name)); - newCode.add("\t\t" + ASSIGN_TO_PTR(structName, "interface_name", "\"" + construct.name + "\"")); + newCode.add("\t\t" + + ASSIGN_TO_PTR(structName, "interface_name", "\"" + + construct.name + "\"")); String anno = "annotation_interface_begin"; newCode.add("\t" + STRUCT_NEW_DECLARE_DEFINE(SPEC_ANNOTATION, anno)); @@ -766,11 +790,15 @@ public class CodeVariables { String labelNum = Integer.toString(semantics.commitPointLabel2Num .get(construct.label)); newCode.add("\t\t" + ASSIGN_TO_PTR(structName, "label_num", labelNum)); - newCode.add("\t\t" + ASSIGN_TO_PTR(structName, "label_name", "\"" + construct.label + "\"")); + newCode.add("\t\t" + + ASSIGN_TO_PTR(structName, "label_name", "\"" + + construct.label + "\"")); if (construct.isAdditionalOrderingPoint) { - newCode.add("\t\t" + ASSIGN_TO_PTR(structName, "is_additional_point", "true")); + newCode.add("\t\t" + + ASSIGN_TO_PTR(structName, "is_additional_point", "true")); } else { - newCode.add("\t\t" + ASSIGN_TO_PTR(structName, "is_additional_point", "false")); + newCode.add("\t\t" + + ASSIGN_TO_PTR(structName, "is_additional_point", "false")); } newCode.add("\t\t" + STRUCT_NEW_DECLARE_DEFINE(SPEC_ANNOTATION, anno)); newCode.add("\t\t" @@ -781,8 +809,9 @@ public class CodeVariables { newCode.add("\t" + "}"); return newCode; } - - public static String getCPInterfaceNum(SemanticsChecker semantics, String commitPointLabel) { + + public static String getCPInterfaceNum(SemanticsChecker semantics, + String commitPointLabel) { HashMap cp2Interface = semantics.CPLabel2InterfaceConstruct; InterfaceConstruct iConstruct = cp2Interface.get(commitPointLabel); String interfaceName = iConstruct.name; @@ -793,8 +822,8 @@ public class CodeVariables { /** *

- * Commit point define check should be unique to each interface, meaning that they - * are not shared between different interfaces + * Commit point define check should be unique to each interface, meaning + * that they are not shared between different interfaces *

* * @param semantics @@ -814,7 +843,7 @@ public class CodeVariables { + construct.label)); newCode.add(""); // Add annotation - + newCode.add("\t" + "if (" + construct.condition + ") {"); String structName = "cp_define_check", anno = "annotation_cp_define_check"; newCode.add("\t\t" @@ -823,12 +852,17 @@ public class CodeVariables { .get(construct.label)); String interfaceNum = getCPInterfaceNum(semantics, construct.label); newCode.add("\t\t" + ASSIGN_TO_PTR(structName, "label_num", labelNum)); - newCode.add("\t\t" + ASSIGN_TO_PTR(structName, "label_name", "\"" + construct.label + "\"")); - newCode.add("\t\t" + ASSIGN_TO_PTR(structName, "interface_num", interfaceNum)); + newCode.add("\t\t" + + ASSIGN_TO_PTR(structName, "label_name", "\"" + + construct.label + "\"")); + newCode.add("\t\t" + + ASSIGN_TO_PTR(structName, "interface_num", interfaceNum)); if (construct.isAdditionalOrderingPoint) { - newCode.add("\t\t" + ASSIGN_TO_PTR(structName, "is_additional_point", "true")); + newCode.add("\t\t" + + ASSIGN_TO_PTR(structName, "is_additional_point", "true")); } else { - newCode.add("\t\t" + ASSIGN_TO_PTR(structName, "is_additional_point", "false")); + newCode.add("\t\t" + + ASSIGN_TO_PTR(structName, "is_additional_point", "false")); } newCode.add("\t\t" + STRUCT_NEW_DECLARE_DEFINE(SPEC_ANNOTATION, anno)); newCode.add("\t\t" @@ -838,19 +872,19 @@ public class CodeVariables { newCode.add("\t" + "}"); return newCode; } - + /** *

- * Commit point define check should be unique to each interface, meaning that they - * are not shared between different interfaces + * Commit point define check should be unique to each interface, meaning + * that they are not shared between different interfaces *

* * @param semantics * @param construct * @return */ - public static ArrayList generateCPClear( - SemanticsChecker semantics, CPClearConstruct construct) { + public static ArrayList generateCPClear(SemanticsChecker semantics, + CPClearConstruct construct) { ArrayList newCode = new ArrayList(); // Add atomic return variable if the predicate accesses to it if (construct.condition.indexOf(MACRO_ATOMIC_RETURN) != -1) { @@ -862,16 +896,18 @@ public class CodeVariables { + construct.label)); newCode.add(""); // Add annotation - + newCode.add("\t" + "if (" + construct.condition + ") {"); String structName = "cp_clear", anno = "annotation_cp_clear"; newCode.add("\t\t" + STRUCT_NEW_DECLARE_DEFINE(ANNO_CP_CLEAR, structName)); -// String labelNum = Integer.toString(semantics.commitPointLabel2Num -// .get(construct.label)); -// String interfaceNum = getCPInterfaceNum(semantics, construct.label); -// newCode.add("\t\t" + ASSIGN_TO_PTR(structName, "label_num", labelNum)); -// newCode.add("\t\t" + ASSIGN_TO_PTR(structName, "interface_num", interfaceNum)); + // String labelNum = Integer.toString(semantics.commitPointLabel2Num + // .get(construct.label)); + // String interfaceNum = getCPInterfaceNum(semantics, construct.label); + // newCode.add("\t\t" + ASSIGN_TO_PTR(structName, "label_num", + // labelNum)); + // newCode.add("\t\t" + ASSIGN_TO_PTR(structName, "interface_num", + // interfaceNum)); newCode.add("\t\t" + STRUCT_NEW_DECLARE_DEFINE(SPEC_ANNOTATION, anno)); newCode.add("\t\t" + ASSIGN_TO_PTR(anno, "type", SPEC_ANNO_TYPE_CP_CLEAR)); @@ -911,16 +947,23 @@ public class CodeVariables { .toString(semantics.commitPointLabel2Num .get(construct.potentialCPLabel)); newCode.add("\t\t" + ASSIGN_TO_PTR(structName, "label_num", labelNum)); - newCode.add("\t\t" + ASSIGN_TO_PTR(structName, "label_name", "\"" + construct.label + "\"")); + newCode.add("\t\t" + + ASSIGN_TO_PTR(structName, "label_name", "\"" + + construct.label + "\"")); newCode.add("\t\t" + ASSIGN_TO_PTR(structName, "potential_cp_label_num", potentialLabelNum)); - newCode.add("\t\t" + ASSIGN_TO_PTR(structName, "potential_label_name", "\"" + construct.potentialCPLabel + "\"")); - newCode.add("\t\t" + ASSIGN_TO_PTR(structName, "interface_num", interfaceNum)); + newCode.add("\t\t" + + ASSIGN_TO_PTR(structName, "potential_label_name", "\"" + + construct.potentialCPLabel + "\"")); + newCode.add("\t\t" + + ASSIGN_TO_PTR(structName, "interface_num", interfaceNum)); if (construct.isAdditionalOrderingPoint) { - newCode.add("\t\t" + ASSIGN_TO_PTR(structName, "is_additional_point", "true")); + newCode.add("\t\t" + + ASSIGN_TO_PTR(structName, "is_additional_point", "true")); } else { - newCode.add("\t\t" + ASSIGN_TO_PTR(structName, "is_additional_point", "false")); + newCode.add("\t\t" + + ASSIGN_TO_PTR(structName, "is_additional_point", "false")); } newCode.add("\t\t" + STRUCT_NEW_DECLARE_DEFINE(SPEC_ANNOTATION, anno)); newCode.add("\t\t"