source: proto/Compiler/compiler2.py @ 1195

Last change on this file since 1195 was 1195, checked in by cameron, 8 years ago

C syntax mode

File size: 3.1 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, tag, globaldecl, localdecl, stream_stmts, block_stmts, final_block_stmts, any_carry_expr, template_string):
20       
21        template_string = string.replace(template_string, tag + 'global', globaldecl)
22        template_string = string.replace(template_string, tag + 'decl', localdecl)
23        template_string = string.replace(template_string, tag + 'stream_stmts', stream_stmts)
24        template_string = string.replace(template_string, tag + 'block_stmts', block_stmts)
25        template_string = string.replace(template_string, tag + 'final_block_stmts', final_block_stmts)
26        template_string = string.replace(template_string, tag + 'any_carry', any_carry_expr)
27        return template_string
28
29    def read_template(self):
30        f=open(self.template_file)
31        inp = ""
32        for line in f:
33            inp += line
34        f.close()
35        return inp
36
37    def write_final_code(self, code):
38        f=open(self.output_file, 'w')
39        f.write(code)
40        f.close()
41
42    def generate_code(self, input_string, options):
43        # FRONT END
44        s = ast.parse(input_string)
45        # Analysis and Transformation
46        xfrmr = pablo.MainLoopTransformer(s, options.C_syntax, options.add_dump_stmts)
47        xfrmr.gen_globals()
48        xfrmr.gen_declarations()
49        xfrmr.gen_initializations()
50        xfrmr.xfrm_block_stmts()     
51
52        # BACK END
53        template_contents = self.read_template()
54               
55        template_contents = self.output(
56                            options.template_label,
57                            xfrmr.Cglobals, 
58                            xfrmr.Cdecls, 
59                            xfrmr.Cinits, 
60                            xfrmr.Cstmts,
61                            xfrmr.Cfinal_stmts,
62                            xfrmr.any_carry_expr(), 
63                            template_contents)
64        self.write_final_code(template_contents)
65        return s
66
67def readfile(filename):
68        f = open(filename, 'r')
69        contents = f.read() 
70        f.close()
71        return contents
72
73if __name__ == '__main__':
74 
75        option_parser = config.get_option_parser() 
76        options, args = option_parser.parse_args(sys.argv[1:])
77
78        # Positional arguments
79        if len(args) != 1:
80            option_parser.print_usage()
81            sys.exit()
82
83        input_file = args[0]
84        input_string = readfile(input_file)
85               
86        # Compiler modes
87        if options.struct_decs:
88                print pablo.StreamStructGen().gen(ast.parse(input_string))
89               
90        elif options.func_defs:
91                print pablo.FunctionXformer().xlat(ast.parse(input_string))
92               
93        else:
94                s = Program(options.output_filename, options.template_filename).generate_code(input_string, options)
Note: See TracBrowser for help on using the repository browser.