source: proto/Compiler/pablomain.py @ 3095

Last change on this file since 3095 was 3095, checked in by cameron, 6 years ago

-C compiler option sets character data base type

File size: 3.7 KB
RevLine 
[1210]1# pablomain.py - compile unbounded bitstreams code into
[753]2#   equivalent block-by-block code in C.
3#
[1210]4# (c) 2011 Robert D. Cameron, Ken Herdy
[753]5# All rights reserved.
6# Licensed to International Characters, Inc. under Academic Free License 3.0
7#
8
[806]9import config, optparse
10import ast, pablo, string, sys, copy, os
[753]11
12class Program:
[804]13    def __init__(self, output_file, template_file = "template.c"):
[753]14        pass
[804]15        self.template_file = template_file
16        self.output_file = output_file
[753]17
[1178]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)
[804]26        return template_string
[753]27
[804]28    def read_template(self):
29        f=open(self.template_file)
[753]30        inp = ""
31        for line in f:
32            inp += line
33        f.close()
34        return inp
35
36    def write_final_code(self, code):
[804]37        f=open(self.output_file, 'w')
[753]38        f.write(code)
39        f.close()
40
[810]41    def generate_code(self, input_string, options):
[753]42        # FRONT END
[804]43        s = ast.parse(input_string)
[777]44        # Analysis and Transformation
[2393]45        xfrmr = pablo.MainLoopTransformer(s, options.C_syntax, options.add_dump_stmts, options.add_assert_bitblock_align, options.dump_func_data)
[880]46        xfrmr.gen_globals()
[777]47        xfrmr.gen_declarations()
48        xfrmr.gen_initializations()
[889]49        xfrmr.xfrm_block_stmts()     
50
[753]51        # BACK END
[804]52        template_contents = self.read_template()
[880]53               
[1178]54        template_contents = self.output(
55                            options.template_label,
56                            xfrmr.Cglobals, 
[880]57                            xfrmr.Cdecls, 
58                            xfrmr.Cinits, 
59                            xfrmr.Cstmts,
[937]60                            xfrmr.Cfinal_stmts,
[777]61                            xfrmr.any_carry_expr(), 
[804]62                            template_contents)
63        self.write_final_code(template_contents)
[753]64        return s
65
[785]66def readfile(filename):
67        f = open(filename, 'r')
68        contents = f.read() 
69        f.close()
70        return contents
[753]71
[785]72if __name__ == '__main__':
73 
[806]74        option_parser = config.get_option_parser() 
75        options, args = option_parser.parse_args(sys.argv[1:])
[753]76
[785]77        # Positional arguments
78        if len(args) != 1:
[811]79            option_parser.print_usage()
80            sys.exit()
[753]81
[804]82        input_file = args[0]
83        input_string = readfile(input_file)
[2099]84
85        pablo.error_routine = options.error_routine
[2612]86
87        pablo.experimentalMode = options.experimental
[3018]88        pablo.multicarryWhileMode = options.multicarryWhileMode
[3095]89        pablo.pablo_char_type = options.pablo_char_type
[2612]90       
[1271]91        if options.use_IDISA:
92                pablo.name_substitution_map = {'bitblock_has_bit' : 'bitblock::any',
93                                             'simd_const_1' : 'mvmd<1>::fill'}
[1997]94        if options.always_inline:
95                pablo.do_block_inline_decorator = 'IDISA_ALWAYS_INLINE '
96                pablo.do_final_block_inline_decorator = 'IDISA_ALWAYS_INLINE '
97
[806]98        # Compiler modes
99        if options.struct_decs:
100                print pablo.StreamStructGen().gen(ast.parse(input_string))
101               
102        elif options.func_defs:
[2393]103                #print pablo.FunctionXformer().xlat(ast.parse(input_string))
104                pass
[806]105               
106        else:
[810]107                s = Program(options.output_filename, options.template_filename).generate_code(input_string, options)
[3018]108
Note: See TracBrowser for help on using the repository browser.