source: proto/Compiler/pablomain.py @ 3589

Last change on this file since 3589 was 3571, checked in by nmedfort, 6 years ago

start of error rewriting work. some clean up done to pablo.py; a few classes in it were moved to pablo_util.py.

File size: 3.3 KB
Line 
1#!/usr/bin/python
2# -*- coding: utf-8 -*-
3
4import config
5import optparse
6import ast
7import pablo
8import string
9import sys
10import copy
11import os
12
13
14class Program:
15
16    def __init__(self, output_file, template_file='template.c'):
17        pass
18        self.template_file = template_file
19        self.output_file = output_file
20
21    def output(
22        self,
23        tag,
24        globaldecl,
25        localdecl,
26        stream_stmts,
27        block_stmts,
28        final_block_stmts,
29        any_carry_expr,
30        template_string,
31        ):
32
33        template_string = string.replace(template_string, tag + 'global', globaldecl)
34        template_string = string.replace(template_string, tag + 'decl', localdecl)
35        template_string = string.replace(template_string, tag + 'stream_stmts', stream_stmts)
36        template_string = string.replace(template_string, tag + 'block_stmts', block_stmts)
37        template_string = string.replace(template_string, tag + 'final_block_stmts', final_block_stmts)
38        template_string = string.replace(template_string, tag + 'any_carry', any_carry_expr)
39        return template_string
40
41    def read_template(self):
42        f = open(self.template_file)
43        inp = ''
44        for line in f:
45            inp += line
46        f.close()
47        return inp
48
49    def write_final_code(self, code):
50        f = open(self.output_file, 'w')
51        f.write(code)
52        f.close()
53
54    def generate_code(self, input_string, options):
55
56        s = ast.parse(input_string)
57
58        xfrmr = pablo.MainLoopTransformer(s, options.C_syntax, options.add_dump_stmts, options.add_assert_bitblock_align, options.dump_func_data)
59        xfrmr.gen_globals()
60        xfrmr.gen_declarations()
61        xfrmr.gen_initializations()
62        xfrmr.xfrm_block_stmts()
63
64        template_contents = self.read_template()
65
66        template_contents = self.output(
67            options.template_label,
68            xfrmr.Cglobals,
69            xfrmr.Cdecls,
70            xfrmr.Cinits,
71            xfrmr.Cstmts,
72            xfrmr.Cfinal_stmts,
73            xfrmr.any_carry_expr(),
74            template_contents,
75            )
76        self.write_final_code(template_contents)
77        return s
78
79
80def readfile(filename):
81    f = open(filename, 'r')
82    contents = f.read()
83    f.close()
84    return contents
85
86
87if __name__ == '__main__':
88
89    option_parser = config.get_option_parser()
90    (options, args) = option_parser.parse_args(sys.argv[1:])
91
92    if len(args) != 1:
93        option_parser.print_usage()
94        sys.exit()
95
96    input_file = args[0]
97    input_string = readfile(input_file)
98
99    pablo.error_routine = options.error_routine
100    pablo.rewrite_errors = options.rewrite_errors
101    pablo.experimentalMode = options.experimental
102    pablo.multicarryWhileMode = options.multicarryWhileMode
103    pablo.pablo_char_type = options.pablo_char_type
104
105    if options.use_IDISA:
106        pablo.name_substitution_map = {'bitblock_has_bit': 'bitblock::any', 'simd_const_1': 'mvmd<1>::fill'}
107    if options.always_inline:
108        pablo.do_block_inline_decorator = 'IDISA_ALWAYS_INLINE '
109        pablo.do_final_block_inline_decorator = 'IDISA_ALWAYS_INLINE '
110
111    if options.struct_decs:
112        print pablo.StreamStructGen().gen(ast.parse(input_string))
113    elif options.func_defs:
114
115        pass
116    else:
117
118        s = Program(options.output_filename, options.template_filename).generate_code(input_string, options)
Note: See TracBrowser for help on using the repository browser.