source: proto/Compiler/pablomain.py @ 1946

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

Added ASSERT_BITBLOCK_ALIGN option -b.

File size: 3.3 KB
Line 
1# pablomain.py - compile unbounded bitstreams code into
2#   equivalent block-by-block code in C.
3#
4# (c) 2011 Robert D. Cameron, Ken Herdy
5# All rights reserved.
6# Licensed to International Characters, Inc. under Academic Free License 3.0
7#
8
9import config, optparse
10import ast, pablo, string, sys, copy, os
11
12class Program:
13    def __init__(self, output_file, template_file = "template.c"):
14        pass
15        self.template_file = template_file
16        self.output_file = output_file
17
18    def output(self, tag, globaldecl, localdecl, stream_stmts, block_stmts, final_block_stmts, any_carry_expr, template_string):
19       
20        template_string = string.replace(template_string, tag + 'global', globaldecl)
21        template_string = string.replace(template_string, tag + 'decl', localdecl)
22        template_string = string.replace(template_string, tag + 'stream_stmts', stream_stmts)
23        template_string = string.replace(template_string, tag + 'block_stmts', block_stmts)
24        template_string = string.replace(template_string, tag + 'final_block_stmts', final_block_stmts)
25        template_string = string.replace(template_string, tag + '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.C_syntax, options.add_dump_stmts, options.add_assert_bitblock_align)
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(
55                            options.template_label,
56                            xfrmr.Cglobals, 
57                            xfrmr.Cdecls, 
58                            xfrmr.Cinits, 
59                            xfrmr.Cstmts,
60                            xfrmr.Cfinal_stmts,
61                            xfrmr.any_carry_expr(), 
62                            template_contents)
63        self.write_final_code(template_contents)
64        return s
65
66def readfile(filename):
67        f = open(filename, 'r')
68        contents = f.read() 
69        f.close()
70        return contents
71
72if __name__ == '__main__':
73 
74        option_parser = config.get_option_parser() 
75        options, args = option_parser.parse_args(sys.argv[1:])
76
77        # Positional arguments
78        if len(args) != 1:
79            option_parser.print_usage()
80            sys.exit()
81
82        input_file = args[0]
83        input_string = readfile(input_file)
84               
85        if options.use_IDISA:
86                pablo.name_substitution_map = {'bitblock_has_bit' : 'bitblock::any',
87                                             'simd_const_1' : 'mvmd<1>::fill'}
88               
89        # Compiler modes
90        if options.struct_decs:
91                print pablo.StreamStructGen().gen(ast.parse(input_string))
92               
93        elif options.func_defs:
94                print pablo.FunctionXformer().xlat(ast.parse(input_string))
95               
96        else:
97                s = Program(options.output_filename, options.template_filename).generate_code(input_string, options)
Note: See TracBrowser for help on using the repository browser.