source: proto/Compiler/compiler2.py @ 785

Last change on this file since 785 was 785, checked in by ksherdy, 8 years ago

Use the optparse module to handle command line argument parsing.

File size: 2.8 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 optparse,os
11import ast, pablo, string, sys, copy
12
13class Program:
14    def __init__(self, out_file, template_name = "template.c"):
15        pass
16        self.templ_name = template_name
17        self.outfile_name = out_file
18
19    def output(self, decl, stream_stmts , block_stmts, any_carry_expr, templ):
20        templ = string.replace(templ, '@decl', decl)
21        templ = string.replace(templ, '@stream_stmts', stream_stmts)
22        templ = string.replace(templ, '@block_stmts', block_stmts)
23        templ = string.replace(templ, '@any_carry', any_carry_expr)
24        return templ
25
26    def read_template(self, file_path):
27        f=open(file_path + self.templ_name)
28        inp = ""
29        for line in f:
30            inp += line
31        f.close()
32        return inp
33
34    def write_final_code(self, code):
35        f=open(self.outfile_name, 'w')
36        f.write(code)
37        f.close()
38
39    def generate_code(self, s, file_path):
40        # FRONT END
41        s = ast.parse(s)
42        # Analysis and Transformation
43        xfrmr = pablo.MainLoopTransformer(s, "carryQ")
44        xfrmr.gen_declarations()
45        xfrmr.gen_initializations()
46        xfrmr.xfrm_block_stmts()     
47        xfrmr.add_loop_carryQ_adjust()
48        # BACK END
49        templ = self.read_template(file_path)
50        templ = self.output(xfrmr.getCdecls(), 
51                            xfrmr.getCinits(), 
52                            xfrmr.getCstmts(),
53                            xfrmr.any_carry_expr(), 
54                            templ)
55        self.write_final_code(templ)
56        return s
57
58def readfile(filename):
59        f = open(filename, 'r')
60        contents = f.read() 
61        f.close()
62        return contents
63
64if __name__ == '__main__':
65 
66        # optparse
67        parser = optparse.OptionParser(usage='python %prog [options] <input file>',
68                                        version='1.0',
69                                        )
70       
71        # Argument definitions
72        parser.add_option('-t', '--template', 
73                          dest='template_filename',
74                          type='string',
75                          default='template.c',
76                          help='default:template.c'
77                          )
78
79        parser.add_option('-o', '--output', 
80                          dest='output_filename', 
81                          type='string',
82                          default='code.c',
83                          help='default:code.c',
84                          )
85                         
86        options, args = parser.parse_args()
87
88        # Positional arguments
89        if len(args) != 1:
90          parser.print_usage()
91
92        input_longpath = args[0]
93        input_dirname =  os.path.dirname(input_longpath)
94        input_content = readfile(input_longpath)
95
96        # Optional arguments
97        output_filename = options.output_filename
98        template_filename = options.template_filename
99
100        s = Program(output_filename, template_filename).generate_code(input_content, input_dirname)
Note: See TracBrowser for help on using the repository browser.