/* * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer; * redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution; * neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Type.hh * * Description: * * $Id$ * * */ #ifndef TYPE_H #define TYPE_H #include "mem/slicc/slicc_global.hh" #include "mem/gems_common/Map.hh" #include "mem/slicc/symbols/Symbol.hh" class StateMachine; class Type : public Symbol { public: // Constructors Type(string id, const Location& location, const Map& pairs, StateMachine* machine_ptr = NULL); // Destructor ~Type() {} // Public Methods string cIdent() const { return m_c_id; } string desc() const { return m_desc; } bool isPrimitive() const { return existPair("primitive"); } bool isNetworkMessage() const { return existPair("networkmessage"); } bool isMessage() const { return existPair("message"); } bool isBuffer() const { return existPair("buffer"); } bool isInPort() const { return existPair("inport"); } bool isOutPort() const { return existPair("outport"); } bool isEnumeration() const { return existPair("enumeration"); } bool isExternal() const { return existPair("external"); } bool isGlobal() const { return existPair("global"); } bool isInterface() const { return existPair("interface"); } // The data members of this type - only valid for messages and SLICC // declared structures // Return false on error bool dataMemberAdd(string id, Type* type_ptr, Map& pairs, string* init_code); bool dataMemberExist(string id) const { return m_data_member_map.exist(id); } Type* dataMemberType(string id) const { return m_data_member_map.lookup(id); } // The methods of this type - only valid for external types // Return false on error bool methodAdd(string name, Type* return_type_ptr, const Vector& param_type_vec); bool methodExist(string id) const { return m_method_return_type_map.exist(id); } string methodId(string name, const Vector& param_type_vec); Type* methodReturnType(string id) const { return m_method_return_type_map.lookup(id); } const Vector& methodParamType(string id) const { return m_method_param_type_map.lookup(id); } // The enumeration idents of this type - only valid for enums // Return false on error bool enumAdd(string id, Map pairs); bool enumExist(string id) const { return m_enum_map.exist(id); } // Write the C output files void writeCFiles(string path) ; bool hasDefault() const { return existPair("default"); } string getDefault() const { return lookupPair("default"); } void print(ostream& out) const {} private: // Private Methods void printTypeH(string path) const; void printTypeC(string path) const; void printEnumC(string path) const; void printEnumH(string path) const; // Private copy constructor and assignment operator Type(const Type& obj); Type& operator=(const Type& obj); // Data Members (m_ prefix) string m_c_id; string m_desc; // Data Members Map m_data_member_map; Vector m_data_member_ident_vec; Vector m_data_member_type_vec; Vector > m_data_member_pairs_vec; Vector m_data_member_init_code_vec; // Needs pairs here // Methods Map m_method_return_type_map; Map > m_method_param_type_map; // Needs pairs here // Enum Map m_enum_map; Vector m_enum_vec; Vector< Map < string, string > > m_enum_pairs; // MachineType Hack bool m_isMachineType; }; // Output operator declaration ostream& operator<<(ostream& out, const Type& obj); // ******************* Definitions ******************* // Output operator definition extern inline ostream& operator<<(ostream& out, const Type& obj) { obj.print(out); out << flush; return out; } #endif //TYPE_H