source: proto/Compiler/compiler2.py @ 865

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

Add @global declaration template facility; use for struct types.

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) 2010 Robert D. Cameron, Ehsan Amiri, Ken Herdy
6# All rights reserved.
7# Licensed to International Characters, Inc. under Academic Free License 3.0
8#
9
10import config, optparse
11import ast, pablo, string, sys, copy, os
12
13class Program:
14    def __init__(self, output_file, template_file = "template.c"):
15        pass
16        self.template_file = template_file
17        self.output_file = output_file
18
19    def output(self, globaldecl, localdecl, stream_stmts , block_stmts, any_carry_expr, template_string):
20        template_string = string.replace(template_string, '@global', globaldecl)
21        template_string = string.replace(template_string, '@decl', localdecl)
22        template_string = string.replace(template_string, '@stream_stmts', stream_stmts)
23        template_string = string.replace(template_string, '@block_stmts', block_stmts)
24        template_string = string.replace(template_string, '@any_carry', any_carry_expr)
25        return template_string
26
27    def read_template(self):
28        f=open(self.template_file)
29        inp = ""
30        for line in f:
31            inp += line
32        f.close()
33        return inp
34
35    def write_final_code(self, code):
36        f=open(self.output_file, 'w')
37        f.write(code)
38        f.close()
39
40    def generate_code(self, input_string, options):
41        # FRONT END
42        s = ast.parse(input_string)
43        # Analysis and Transformation
44        xfrmr = pablo.MainLoopTransformer(s, "carryQ")
45        xfrmr.gen_declarations()
46        xfrmr.gen_initializations()
47        xfrmr.xfrm_block_stmts(options.add_dump_stmts)     
48        xfrmr.add_loop_carryQ_adjust()
49        # BACK END
50        template_contents = self.read_template()
51        template_contents = self.output(xfrmr.getCglobals(), 
52                            xfrmr.getCdecls(), 
53                            xfrmr.getCinits(), 
54                            xfrmr.getCstmts(),
55                            xfrmr.any_carry_expr(), 
56                            template_contents)
57        self.write_final_code(template_contents)
58        return s
59
60def readfile(filename):
61        f = open(filename, 'r')
62        contents = f.read() 
63        f.close()
64        return contents
65
66if __name__ == '__main__':
67 
68        option_parser = config.get_option_parser() 
69        options, args = option_parser.parse_args(sys.argv[1:])
70
71        # Positional arguments
72        if len(args) != 1:
73            option_parser.print_usage()
74            sys.exit()
75
76        input_file = args[0]
77        input_string = readfile(input_file)
78               
79        # Compiler modes
80        if options.struct_decs:
81                print pablo.StreamStructGen().gen(ast.parse(input_string))
82               
83        elif options.func_defs:
84                print pablo.FunctionXformer().xlat(ast.parse(input_string))
85               
86        else:
87                s = Program(options.output_filename, options.template_filename).generate_code(input_string, options)
Note: See TracBrowser for help on using the repository browser.