source: proto/Compiler/compiler2.py @ 777

Last change on this file since 777 was 777, checked in by cameron, 9 years ago

Better encapsulation with MainLoopTransformer?

File size: 3.7 KB
Line 
1# -*- coding: utf-8 -*-
2# bitstream_compiler.py - compile unbounded bitstreams code into
3#   equivalent block-by-block code in C.
4#
5# (c) 2009 Ehsan Amiri and Robert D. Cameron
6# All rights reserved.
7# Licensed to International Characters, Inc. under Academic Free License 3.0
8#
9
10import ast, pablo, string, sys, copy
11
12class Program:
13    def __init__(self, out_file, template_name = "template.c"):
14        pass
15        self.templ_name = template_name
16        self.outfile_name = out_file
17
18    def output(self, decl, stream_stmts , block_stmts, any_carry_expr, templ):
19        templ = string.replace(templ, '@decl', decl)
20        templ = string.replace(templ, '@stream_stmts', stream_stmts)
21        templ = string.replace(templ, '@block_stmts', block_stmts)
22        templ = string.replace(templ, '@any_carry', any_carry_expr)
23        return templ
24
25    def read_template(self, file_path):
26        f=open(file_path + self.templ_name)
27        inp = ""
28        for line in f:
29            inp += line
30        f.close()
31        return inp
32
33    def write_final_code(self, code):
34        f=open(self.outfile_name, 'w')
35        f.write(code)
36        f.close()
37
38    def generate_code(self, s, file_path):
39        # FRONT END
40        s = ast.parse(s)
41        # Analysis and Transformation
42        xfrmr = pablo.MainLoopTransformer(s, "carryQ")
43        xfrmr.gen_declarations()
44        xfrmr.gen_initializations()
45        xfrmr.xfrm_block_stmts()     
46        # BACK END
47        templ = self.read_template(file_path)
48        templ = self.output(xfrmr.getCdecls(), 
49                            xfrmr.getCinits(), 
50                            xfrmr.getCstmts(),
51                            xfrmr.any_carry_expr(), 
52                            templ)
53        self.write_final_code(templ)
54        return s
55
56OPTION_TEMPLATE_NAME = '-t'
57
58
59def read_flags (params):
60    flags = []
61    non_flags = []
62    last_one_continues = False
63    l = len(params)
64    for i in range(l):
65        if params[i][0] == '-' or last_one_continues:
66            flags.append(params[i])
67            if params[i]  == OPTION_TEMPLATE_NAME:
68                last_one_continues = True
69            else:
70                last_one_continues = False
71        else:
72            non_flags.append(params[i])
73
74    return flags, non_flags
75
76def option_template(flags):
77    t_name = "template.c"
78    l = len(flags)
79    for i in range(l):
80        if flags[i] == '-t':
81            if len(flags) == i+1:
82                print flags
83                print "WARNING: -t flag used but no template name is given. Default name is used."
84            else:
85                t_name = flags[i+1]
86                return t_name, i
87
88    return t_name, -1
89
90def read_input(inp_file_name):
91    mycode = ""
92    inp_file = open(non_flags[1])
93    for line in inp_file:
94        mycode += line
95    inp_file.close()
96    return mycode
97
98def read_options(flags):
99    template_name, index = option_template(flags)
100    if index >= 0:
101        del flags[index+1]
102        del flags[index]
103   
104    if len(flags) > 0:
105        print "WARNING: Unrecognized/duplicated options found!"
106   
107    return template_name
108###############################################################
109
110if __name__ == '__main__':
111        if len(sys.argv) < 2:
112            print "Usage: python bitstream_compiler.py <input file> [output file] options"
113            #exit()
114
115        flags, non_flags = read_flags(sys.argv)
116        print non_flags
117        last_slash = non_flags[1].rfind("/")
118        file_path = non_flags[1][:last_slash+1]
119       
120        out_file = "code.c"
121        if len(non_flags) >= 3:
122            out_file = non_flags[2]
123       
124        template_name = read_options(flags)
125       
126        s = Program(out_file, template_name).generate_code(read_input(non_flags[1]), file_path)
Note: See TracBrowser for help on using the repository browser.