source: proto/Compiler/compiler2.py @ 937

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

Add processing for @final_block_stmts.

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