1 package edu.uci.eecs.specCompiler.codeGenerator;
3 import java.io.BufferedReader;
5 import java.io.FileNotFoundException;
6 import java.io.FileReader;
7 import java.io.IOException;
8 import java.util.ArrayList;
9 import java.util.HashMap;
11 import edu.uci.eecs.specCompiler.specExtraction.GlobalConstruct;
12 import edu.uci.eecs.specCompiler.specExtraction.SpecConstruct;
13 import edu.uci.eecs.specCompiler.specExtraction.SpecExtractor;
14 import edu.uci.eecs.specCompiler.specExtraction.SpecNotMatchException;
18 * This class will generate the annotated C code that can run on the current
25 public class CodeGenerator {
26 private SemanticsChecker _semantics;
27 private SpecExtractor _extractor;
29 private File[] srcFiles;
31 private HashMap<File, ArrayList<String>> contents;
33 private HashMap<File, ArrayList<CodeAddition>> codeAdditions;
35 public CodeGenerator(File[] srcFiles) {
36 this.srcFiles = srcFiles;
37 this.contents = new HashMap<File, ArrayList<String>>();
39 this.codeAdditions = new HashMap<File, ArrayList<CodeAddition>>();
41 _extractor = new SpecExtractor();
44 _extractor.extract(srcFiles);
45 } catch (SpecNotMatchException e1) {
49 _semantics = new SemanticsChecker(_extractor.getConstructs());
52 System.out.println(_semantics);
53 } catch (SemanticsCheckerException e) {
58 private ArrayList<String> readSrcFile(File f) throws IOException {
59 BufferedReader bf = new BufferedReader(new FileReader(f));
60 ArrayList<String> content = new ArrayList<String>();
62 while ((curLine = bf.readLine()) != null) {
68 private void readSrcFiles() {
69 for (int i = 0; i < srcFiles.length; i++) {
71 if (!contents.containsKey(f)) {
73 contents.put(f, readSrcFile(f));
74 } catch (IOException e) {
83 * Generate all the global code, including the "@DefineVar" in each
87 private void globalConstruct2Code(SpecConstruct inst) {
88 int lineNum = inst.endLineNum + 1;
89 GlobalConstruct construct = (GlobalConstruct) inst.construct;
90 ArrayList<String> newCode = new ArrayList<String>();
92 // Generate the code in global construct first
93 String globalCode = construct.code;
94 int begin = 0, end = 0;
95 while (end < globalCode.length()) {
96 if (globalCode.charAt(end) == '\n') {
97 String line = globalCode.substring(begin, end);
104 CodeAddition addition = new CodeAddition(lineNum, newCode);
105 if (!codeAdditions.containsKey(inst.file)) {
106 codeAdditions.put(inst.file, new ArrayList<CodeAddition>());
108 codeAdditions.get(inst.file).add(addition);
111 private void interface2Code(SpecConstruct inst) {
112 int lineNum = inst.endLineNum + 1;
113 GlobalConstruct construct = (GlobalConstruct) inst.construct;
114 ArrayList<String> newCode = new ArrayList<String>();
117 CodeAddition addition = new CodeAddition(lineNum, newCode);
118 if (!codeAdditions.containsKey(inst.file)) {
119 codeAdditions.put(inst.file, new ArrayList<CodeAddition>());
121 codeAdditions.get(inst.file).add(addition);
124 private void potentialCP2Code(SpecConstruct inst) {
125 int lineNum = inst.endLineNum + 1;
126 GlobalConstruct construct = (GlobalConstruct) inst.construct;
127 ArrayList<String> newCode = new ArrayList<String>();
130 CodeAddition addition = new CodeAddition(lineNum, newCode);
131 if (!codeAdditions.containsKey(inst.file)) {
132 codeAdditions.put(inst.file, new ArrayList<CodeAddition>());
134 codeAdditions.get(inst.file).add(addition);
137 private void CPDefine2Code(SpecConstruct inst) {
138 int lineNum = inst.endLineNum + 1;
139 GlobalConstruct construct = (GlobalConstruct) inst.construct;
140 ArrayList<String> newCode = new ArrayList<String>();
143 CodeAddition addition = new CodeAddition(lineNum, newCode);
144 if (!codeAdditions.containsKey(inst.file)) {
145 codeAdditions.put(inst.file, new ArrayList<CodeAddition>());
147 codeAdditions.get(inst.file).add(addition);
150 private void CPDefineCheck2Code(SpecConstruct inst) {
151 int lineNum = inst.endLineNum + 1;
152 GlobalConstruct construct = (GlobalConstruct) inst.construct;
153 ArrayList<String> newCode = new ArrayList<String>();
156 CodeAddition addition = new CodeAddition(lineNum, newCode);
157 if (!codeAdditions.containsKey(inst.file)) {
158 codeAdditions.put(inst.file, new ArrayList<CodeAddition>());
160 codeAdditions.get(inst.file).add(addition);
163 public void generateCode() {
167 public static void main(String[] argvs) {
168 String homeDir = Environment.HOME_DIRECTORY;
170 // new File(homeDir + "/benchmark/linuxrwlocks/linuxrwlocks.c"),
172 + "/benchmark/cliffc-hashtable/simplified_cliffc_hashtable.h"),
173 // new File(homeDir + "/benchmark/ms-queue/my_queue.c")
175 CodeGenerator gen = new CodeGenerator(srcFiles);