sc_export.hh revision 13059
12SN/A/* 21762SN/A * Copyright 2018 Google, Inc. 32SN/A * 42SN/A * Redistribution and use in source and binary forms, with or without 52SN/A * modification, are permitted provided that the following conditions are 62SN/A * met: redistributions of source code must retain the above copyright 72SN/A * notice, this list of conditions and the following disclaimer; 82SN/A * redistributions in binary form must reproduce the above copyright 92SN/A * notice, this list of conditions and the following disclaimer in the 102SN/A * documentation and/or other materials provided with the distribution; 112SN/A * neither the name of the copyright holders nor the names of its 122SN/A * contributors may be used to endorse or promote products derived from 132SN/A * this software without specific prior written permission. 142SN/A * 152SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 162SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 172SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 182SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 192SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 202SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 212SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 222SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 232SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 242SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 252SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 262SN/A * 272665SN/A * Authors: Gabe Black 282665SN/A */ 292SN/A 302SN/A#ifndef __SYSTEMC_EXT_CORE_SC_EXPORT_HH__ 3111263Sandreas.sandberg@arm.com#define __SYSTEMC_EXT_CORE_SC_EXPORT_HH__ 3211263Sandreas.sandberg@arm.com 3312334Sgabeblack@google.com#include "sc_module.hh" // for sc_gen_unique_name 3456SN/A#include "sc_object.hh" 352SN/A 362SN/Anamespace sc_core 3713782Sgabeblack@google.com{ 3813782Sgabeblack@google.com 3913782Sgabeblack@google.comclass sc_interface; 4013782Sgabeblack@google.com 4113782Sgabeblack@google.comclass sc_export_base : public sc_object 4213782Sgabeblack@google.com{ 4313782Sgabeblack@google.com public: 4413782Sgabeblack@google.com sc_export_base(const char *n); 4513782Sgabeblack@google.com ~sc_export_base(); 4613782Sgabeblack@google.com 4713782Sgabeblack@google.com virtual sc_interface *get_iterface() = 0; 4813782Sgabeblack@google.com virtual const sc_interface *get_interface() const = 0; 4913782Sgabeblack@google.com 5013782Sgabeblack@google.com protected: 5113782Sgabeblack@google.com friend class sc_gem5::Kernel; 5213782Sgabeblack@google.com 5313782Sgabeblack@google.com virtual void before_end_of_elaboration() = 0; 5413782Sgabeblack@google.com virtual void end_of_elaboration() = 0; 5513782Sgabeblack@google.com virtual void start_of_simulation() = 0; 562SN/A virtual void end_of_simulation() = 0; 572SN/A}; 582SN/A 592SN/Atemplate <class IF> 602SN/Aclass sc_export : public sc_export_base 612SN/A{ 622SN/A public: 632SN/A sc_export() : 64 sc_export_base(sc_gen_unique_name("export")), interface(nullptr) 65 {} 66 explicit sc_export(const char *n) : 67 sc_export_base(n), interface(nullptr) 68 {} 69 virtual ~sc_export() {} 70 71 virtual const char *kind() const { return "sc_export"; } 72 73 void operator () (IF &i) { bind(i); } 74 virtual void bind(IF &i) { interface = &i; } 75 operator IF & () { return *interface; } 76 operator const IF & () const { return *interface; } 77 78 IF *operator -> () { return interface; } 79 const IF *operator -> () const { return interface; } 80 81 sc_interface *get_iterface() override { return interface; } 82 const sc_interface *get_interface() const override { return interface; } 83 84 protected: 85 void before_end_of_elaboration() {} 86 void end_of_elaboration() {} 87 void start_of_simulation() {} 88 void end_of_simulation() {} 89 90 private: 91 IF *interface; 92 93 // Disabled 94 sc_export(const sc_export<IF> &); 95 sc_export<IF> &operator = (const sc_export<IF> &); 96}; 97 98} // namespace sc_core 99 100#endif //__SYSTEMC_EXT_CORE_SC_EXPORT_HH__ 101