112855Sgabeblack@google.com/***************************************************************************** 212855Sgabeblack@google.com 312855Sgabeblack@google.com Licensed to Accellera Systems Initiative Inc. (Accellera) under one or 412855Sgabeblack@google.com more contributor license agreements. See the NOTICE file distributed 512855Sgabeblack@google.com with this work for additional information regarding copyright ownership. 612855Sgabeblack@google.com Accellera licenses this file to you under the Apache License, Version 2.0 712855Sgabeblack@google.com (the "License"); you may not use this file except in compliance with the 812855Sgabeblack@google.com License. You may obtain a copy of the License at 912855Sgabeblack@google.com 1012855Sgabeblack@google.com http://www.apache.org/licenses/LICENSE-2.0 1112855Sgabeblack@google.com 1212855Sgabeblack@google.com Unless required by applicable law or agreed to in writing, software 1312855Sgabeblack@google.com distributed under the License is distributed on an "AS IS" BASIS, 1412855Sgabeblack@google.com WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 1512855Sgabeblack@google.com implied. See the License for the specific language governing 1612855Sgabeblack@google.com permissions and limitations under the License. 1712855Sgabeblack@google.com 1812855Sgabeblack@google.com *****************************************************************************/ 1912855Sgabeblack@google.com 2012855Sgabeblack@google.com// virtual_bind.cpp -- test for 2112855Sgabeblack@google.com// 2212855Sgabeblack@google.com// Original Author: John Aynsley, Doulos, Inc. 2312855Sgabeblack@google.com// 2412855Sgabeblack@google.com// MODIFICATION LOG - modifiers, enter your name, affiliation, date and 2512855Sgabeblack@google.com// 2612855Sgabeblack@google.com// $Log: virtual_bind.cpp,v $ 2712855Sgabeblack@google.com// Revision 1.2 2011/05/08 19:18:46 acg 2812855Sgabeblack@google.com// Andy Goodrich: remove extraneous + prefixes from git diff. 2912855Sgabeblack@google.com// 3012855Sgabeblack@google.com 3112855Sgabeblack@google.com// Process control method throw_it 3212855Sgabeblack@google.com 3312855Sgabeblack@google.com#define SC_INCLUDE_DYNAMIC_PROCESSES 3412855Sgabeblack@google.com 3512855Sgabeblack@google.com#include <systemc> 3612855Sgabeblack@google.com 3712855Sgabeblack@google.comusing namespace sc_core; 3812855Sgabeblack@google.comusing std::cout; 3912855Sgabeblack@google.comusing std::endl; 4012855Sgabeblack@google.com 4112855Sgabeblack@google.comstruct i_f: virtual sc_interface 4212855Sgabeblack@google.com{ 4312855Sgabeblack@google.com virtual void meth() = 0; 4412855Sgabeblack@google.com}; 4512855Sgabeblack@google.com 4612855Sgabeblack@google.comstruct Chan: i_f, sc_module 4712855Sgabeblack@google.com{ 4812855Sgabeblack@google.com int f1; 4912855Sgabeblack@google.com Chan(sc_module_name _name) 5012855Sgabeblack@google.com { 5112855Sgabeblack@google.com f1 = 0; 5212855Sgabeblack@google.com } 5312855Sgabeblack@google.com virtual void meth() { f1 = 1; } 5412855Sgabeblack@google.com}; 5512855Sgabeblack@google.com 5612855Sgabeblack@google.comstruct my_port: sc_port<i_f> 5712855Sgabeblack@google.com{ 5812855Sgabeblack@google.com void bind(i_f& _if) 5912855Sgabeblack@google.com { 6012855Sgabeblack@google.com sc_assert(false); 6112855Sgabeblack@google.com } 6212855Sgabeblack@google.com}; 6312855Sgabeblack@google.com 6412855Sgabeblack@google.comstruct extended_port: my_port 6512855Sgabeblack@google.com{ 6612855Sgabeblack@google.com int f2; 6712855Sgabeblack@google.com extended_port() { f2 = 0; } 6812855Sgabeblack@google.com 6912855Sgabeblack@google.com void bind(i_f& _if) 7012855Sgabeblack@google.com { 7112855Sgabeblack@google.com sc_port<i_f>::bind(_if); 7212855Sgabeblack@google.com f2 = 1; 7312855Sgabeblack@google.com } 7412855Sgabeblack@google.com}; 7512855Sgabeblack@google.com 7612855Sgabeblack@google.comstruct my_export: sc_export<i_f> 7712855Sgabeblack@google.com{ 7812855Sgabeblack@google.com void bind(i_f& _if) 7912855Sgabeblack@google.com { 8012855Sgabeblack@google.com sc_assert(false); 8112855Sgabeblack@google.com } 8212855Sgabeblack@google.com}; 8312855Sgabeblack@google.com 8412855Sgabeblack@google.comstruct extended_export: my_export 8512855Sgabeblack@google.com{ 8612855Sgabeblack@google.com int f3; 8712855Sgabeblack@google.com extended_export() { f3 = 0; } 8812855Sgabeblack@google.com 8912855Sgabeblack@google.com void bind(i_f& _if) 9012855Sgabeblack@google.com { 9112855Sgabeblack@google.com sc_export<i_f>::bind(_if); 9212855Sgabeblack@google.com f3 = 1; 9312855Sgabeblack@google.com } 9412855Sgabeblack@google.com}; 9512855Sgabeblack@google.com 9612855Sgabeblack@google.comstruct Child: sc_module 9712855Sgabeblack@google.com{ 9812855Sgabeblack@google.com extended_port p; 9912855Sgabeblack@google.com extended_export xp; 10012855Sgabeblack@google.com 10112855Sgabeblack@google.com Chan chan; 10212855Sgabeblack@google.com 10312855Sgabeblack@google.com Child(sc_module_name _name) 10412855Sgabeblack@google.com : chan("chan") 10512855Sgabeblack@google.com { 10612855Sgabeblack@google.com my_export* mxp = static_cast<my_export*>( &xp ); 10712855Sgabeblack@google.com mxp->bind(chan); // bind should be virtual 10812855Sgabeblack@google.com SC_THREAD(T); 10912855Sgabeblack@google.com } 11012855Sgabeblack@google.com 11112855Sgabeblack@google.com void T() 11212855Sgabeblack@google.com { 11312855Sgabeblack@google.com p->meth(); 11412855Sgabeblack@google.com } 11512855Sgabeblack@google.com 11612855Sgabeblack@google.com SC_HAS_PROCESS(Child); 11712855Sgabeblack@google.com}; 11812855Sgabeblack@google.com 11912855Sgabeblack@google.comstruct Top: sc_module 12012855Sgabeblack@google.com{ 12112855Sgabeblack@google.com Child *child; 12212855Sgabeblack@google.com Chan chan; 12312855Sgabeblack@google.com 12412855Sgabeblack@google.com Top(sc_module_name _name) 12512855Sgabeblack@google.com : chan("chan") 12612855Sgabeblack@google.com { 12712855Sgabeblack@google.com child = new Child("child"); 12812855Sgabeblack@google.com extended_port* ep = &(child->p); 12912855Sgabeblack@google.com my_port* mp = static_cast<my_port*>(ep); 13012855Sgabeblack@google.com mp->bind(chan); // bind should be virtual 13112855Sgabeblack@google.com 13212855Sgabeblack@google.com SC_THREAD(T); 13312855Sgabeblack@google.com } 13412855Sgabeblack@google.com 13512855Sgabeblack@google.com void T() 13612855Sgabeblack@google.com { 13712855Sgabeblack@google.com child->xp->meth(); 13812855Sgabeblack@google.com } 13912855Sgabeblack@google.com 14012855Sgabeblack@google.com SC_HAS_PROCESS(Top); 14112855Sgabeblack@google.com}; 14212855Sgabeblack@google.com 14312855Sgabeblack@google.comint sc_main(int argc, char* argv[]) 14412855Sgabeblack@google.com{ 14512855Sgabeblack@google.com Top top("top"); 14612855Sgabeblack@google.com 14712855Sgabeblack@google.com sc_start(); 14812855Sgabeblack@google.com 14912855Sgabeblack@google.com sc_assert( top.chan.f1 ); 15012855Sgabeblack@google.com sc_assert( top.child->chan.f1 ); 15112855Sgabeblack@google.com sc_assert( top.child->p.f2 ); 15212855Sgabeblack@google.com sc_assert( top.child->xp.f3 ); 15312855Sgabeblack@google.com 15412855Sgabeblack@google.com cout << endl << "Success" << endl; 15512855Sgabeblack@google.com return 0; 15612855Sgabeblack@google.com} 15712855Sgabeblack@google.com 158