Func.py revision 11049
14604Sgblack@eecs.umich.edu# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
24604Sgblack@eecs.umich.edu# Copyright (c) 2009 The Hewlett-Packard Development Company
34604Sgblack@eecs.umich.edu# All rights reserved.
44604Sgblack@eecs.umich.edu#
54604Sgblack@eecs.umich.edu# Redistribution and use in source and binary forms, with or without
64604Sgblack@eecs.umich.edu# modification, are permitted provided that the following conditions are
74604Sgblack@eecs.umich.edu# met: redistributions of source code must retain the above copyright
84604Sgblack@eecs.umich.edu# notice, this list of conditions and the following disclaimer;
94604Sgblack@eecs.umich.edu# redistributions in binary form must reproduce the above copyright
104604Sgblack@eecs.umich.edu# notice, this list of conditions and the following disclaimer in the
114604Sgblack@eecs.umich.edu# documentation and/or other materials provided with the distribution;
124604Sgblack@eecs.umich.edu# neither the name of the copyright holders nor the names of its
134604Sgblack@eecs.umich.edu# contributors may be used to endorse or promote products derived from
144604Sgblack@eecs.umich.edu# this software without specific prior written permission.
154604Sgblack@eecs.umich.edu#
164604Sgblack@eecs.umich.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
174604Sgblack@eecs.umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
184604Sgblack@eecs.umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
194604Sgblack@eecs.umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
204604Sgblack@eecs.umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
214604Sgblack@eecs.umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
224604Sgblack@eecs.umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
234604Sgblack@eecs.umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
244604Sgblack@eecs.umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
254604Sgblack@eecs.umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
264604Sgblack@eecs.umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
274604Sgblack@eecs.umich.edu
284604Sgblack@eecs.umich.edufrom slicc.symbols.Symbol import Symbol
294604Sgblack@eecs.umich.edufrom slicc.symbols.Type import Type
304604Sgblack@eecs.umich.edu
314604Sgblack@eecs.umich.educlass Func(Symbol):
324604Sgblack@eecs.umich.edu    def __init__(self, table, ident, name, location, return_type, param_types,
334604Sgblack@eecs.umich.edu                 param_strings, body, pairs):
344604Sgblack@eecs.umich.edu        super(Func, self).__init__(table, ident, location, pairs)
354604Sgblack@eecs.umich.edu        self.return_type = return_type
364604Sgblack@eecs.umich.edu        self.param_types = param_types
374604Sgblack@eecs.umich.edu        self.param_strings = param_strings
384604Sgblack@eecs.umich.edu        self.body = body
394604Sgblack@eecs.umich.edu        self.isInternalMachineFunc = False
404604Sgblack@eecs.umich.edu        self.c_ident = ident
414604Sgblack@eecs.umich.edu        self.c_name = name
424604Sgblack@eecs.umich.edu        self.class_name = ""
434604Sgblack@eecs.umich.edu
444604Sgblack@eecs.umich.edu    def __repr__(self):
454604Sgblack@eecs.umich.edu        return ""
464604Sgblack@eecs.umich.edu
474604Sgblack@eecs.umich.edu    @property
484604Sgblack@eecs.umich.edu    def prototype(self):
494604Sgblack@eecs.umich.edu        if "external" in self:
504604Sgblack@eecs.umich.edu            return ""
514604Sgblack@eecs.umich.edu
524604Sgblack@eecs.umich.edu        return_type = self.return_type.c_ident
534604Sgblack@eecs.umich.edu        void_type = self.symtab.find("void", Type)
544604Sgblack@eecs.umich.edu        if "return_by_ref" in self and self.return_type != void_type:
554604Sgblack@eecs.umich.edu            return_type += "&"
564604Sgblack@eecs.umich.edu        elif "return_by_pointer" in self and self.return_type != void_type:
574604Sgblack@eecs.umich.edu            return_type += "*"
584604Sgblack@eecs.umich.edu
594604Sgblack@eecs.umich.edu        return "%s %s(%s);" % (return_type, self.c_name,
604604Sgblack@eecs.umich.edu                               ", ".join(self.param_strings))
614604Sgblack@eecs.umich.edu
624604Sgblack@eecs.umich.edu    def writeCodeFiles(self, path, includes):
634604Sgblack@eecs.umich.edu        return
644604Sgblack@eecs.umich.edu
654604Sgblack@eecs.umich.edu    def generateCode(self):
664604Sgblack@eecs.umich.edu        '''This write a function of object Chip'''
674604Sgblack@eecs.umich.edu        if "external" in self:
684604Sgblack@eecs.umich.edu            return ""
694712Sgblack@eecs.umich.edu
704712Sgblack@eecs.umich.edu        code = self.symtab.codeFormatter()
714604Sgblack@eecs.umich.edu
724604Sgblack@eecs.umich.edu        # Generate function header
734604Sgblack@eecs.umich.edu        void_type = self.symtab.find("void", Type)
744604Sgblack@eecs.umich.edu        return_type = self.return_type.c_ident
754604Sgblack@eecs.umich.edu        if "return_by_ref" in self and self.return_type != void_type:
764848Sgblack@eecs.umich.edu            return_type += "&"
774604Sgblack@eecs.umich.edu        if "return_by_pointer" in self and self.return_type != void_type:
784604Sgblack@eecs.umich.edu            return_type += "*"
794604Sgblack@eecs.umich.edu
804604Sgblack@eecs.umich.edu        params = ', '.join(self.param_strings)
814604Sgblack@eecs.umich.edu
824604Sgblack@eecs.umich.edu        code('''
834712Sgblack@eecs.umich.edu$return_type
844604Sgblack@eecs.umich.edu${{self.class_name}}::${{self.c_name}}($params)
854712Sgblack@eecs.umich.edu{
864712Sgblack@eecs.umich.edu${{self.body}}
874848Sgblack@eecs.umich.edu}
884604Sgblack@eecs.umich.edu''')
894604Sgblack@eecs.umich.edu        return str(code)
904604Sgblack@eecs.umich.edu
914863Sgblack@eecs.umich.edu__all__ = [ "Func" ]
924863Sgblack@eecs.umich.edu