| /***************************************************************************** |
| |
| Licensed to Accellera Systems Initiative Inc. (Accellera) under one or |
| more contributor license agreements. See the NOTICE file distributed |
| with this work for additional information regarding copyright ownership. |
| Accellera licenses this file to you under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with the |
| License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
| implied. See the License for the specific language governing |
| permissions and limitations under the License. |
| |
| *****************************************************************************/ |
| |
| /***************************************************************************** |
| |
| test05.cpp -- Test sc_vector (and its binding functions) |
| |
| Original Author: Philipp A. Hartmann, OFFIS, 2010-03-05 |
| |
| *****************************************************************************/ |
| |
| /***************************************************************************** |
| |
| MODIFICATION LOG - modifiers, enter your name, affiliation, date and |
| changes you are making here. |
| |
| Name, Affiliation, Date: |
| Description of Modification: |
| |
| *****************************************************************************/ |
| |
| #include <systemc.h> |
| |
| using sc_core::sc_vector; |
| |
| typedef sc_vector< sc_fifo_out<int> > port_vec; |
| |
| static void |
| dump_port_array( const char* from, const port_vec& in ) |
| { |
| std::cout << "\n" << from << "\n"; |
| for( unsigned i=0; i<in.size(); ++i ) |
| { |
| std::cout |
| << " " |
| << in[i].name() |
| << ".size() == " << in[i].size(); |
| |
| for( int j=0; j<in[i].size(); ++j) |
| { |
| std::cout |
| << " - " |
| << dynamic_cast<const sc_core::sc_object*>(in[i][j])->name() |
| << " @ " << j; |
| } |
| std::cout << std::endl; |
| } |
| } |
| |
| SC_MODULE(sub_module) |
| { |
| port_vec in; |
| |
| sub_module( sc_core::sc_module_name, unsigned n_sub ) |
| : in("in", n_sub ) {} |
| |
| void before_end_of_elaboration() |
| { dump_port_array( "sub_module::before_end_of_elaboration", in ); } |
| void end_of_elaboration() |
| { dump_port_array( "sub_module::end_of_elaboration", in ); } |
| }; |
| |
| |
| SC_MODULE(module) |
| { |
| sub_module sub; |
| port_vec in; |
| |
| SC_CTOR(module) |
| : sub("sub", 4), in("in",4) |
| { |
| // vector to vector binding |
| sub.in( in ); |
| } |
| |
| void before_end_of_elaboration() |
| { dump_port_array( "module::before_end_of_elaboration", in ); } |
| void end_of_elaboration() |
| { dump_port_array( "module::end_of_elaboration", in ); } |
| }; |
| |
| int sc_main( int, char*[] ) |
| { |
| |
| module top("top"); |
| |
| const unsigned size = 4; |
| const unsigned half = 2; |
| |
| sc_assert( top.in.size() == size ); |
| |
| sc_vector< sc_fifo<int> > |
| fifo_1( "src_1", half ), |
| fifo_2( "src_2", size ); |
| |
| // bind full vector (smaller than target) |
| port_vec::iterator mid = top.in( fifo_1 ); |
| sc_assert( ( mid - top.in.begin() ) - half == 0 ); |
| |
| // bind range, starting from last position |
| mid = top.in.bind( fifo_2.begin(), fifo_2.end(), mid ); |
| sc_assert( mid == top.in.end() ); |
| |
| // bind a plain C array of channels |
| sc_fifo<int> fifo_a[ half ]; |
| top.sub.in( fifo_a, fifo_a + half ); |
| |
| sc_start(); |
| return 0; |
| } |