source: proto/Compiler/compiler2.py @ 771

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

Handling stream_stmts initializations

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        self.mainfn = s.body[-1]
42        assert (isinstance(self.mainfn, ast.FunctionDef))
43
44
45
46        # BACK END
47        templ = self.read_template(file_path)
48        stream_stmts = pablo.stream_stmts(s)
49        declarations = pablo.gen_declarations(s, self.mainfn)
50 
51        templ = self.output(declarations, 
52                            stream_stmts, 
53                            pablo.block_stmts(self.mainfn), 
54                            pablo.any_carry_expr(self.mainfn), 
55                            templ)
56        self.write_final_code(templ)
57        return s
58
59OPTION_TEMPLATE_NAME = '-t'
60
61
62def read_flags (params):
63    flags = []
64    non_flags = []
65    last_one_continues = False
66    l = len(params)
67    for i in range(l):
68        if params[i][0] == '-' or last_one_continues:
69            flags.append(params[i])
70            if params[i]  == OPTION_TEMPLATE_NAME:
71                last_one_continues = True
72            else:
73                last_one_continues = False
74        else:
75            non_flags.append(params[i])
76
77    return flags, non_flags
78
79def option_template(flags):
80    t_name = "template.c"
81    l = len(flags)
82    for i in range(l):
83        if flags[i] == '-t':
84            if len(flags) == i+1:
85                print flags
86                print "WARNING: -t flag used but no template name is given. Default name is used."
87            else:
88                t_name = flags[i+1]
89                return t_name, i
90
91    return t_name, -1
92
93def read_input(inp_file_name):
94    mycode = ""
95    inp_file = open(non_flags[1])
96    for line in inp_file:
97        mycode += line
98    inp_file.close()
99    return mycode
100
101def read_options(flags):
102    template_name, index = option_template(flags)
103    if index >= 0:
104        del flags[index+1]
105        del flags[index]
106   
107    if len(flags) > 0:
108        print "WARNING: Unrecognized/duplicated options found!"
109   
110    return template_name
111###############################################################
112
113if __name__ == '__main__':
114        if len(sys.argv) < 2:
115            print "Usage: python bitstream_compiler.py <input file> [output file] options"
116            #exit()
117
118        flags, non_flags = read_flags(sys.argv)
119        print non_flags
120        last_slash = non_flags[1].rfind("/")
121        file_path = non_flags[1][:last_slash+1]
122       
123        out_file = "code.c"
124        if len(non_flags) >= 3:
125            out_file = non_flags[2]
126       
127        template_name = read_options(flags)
128       
129        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.