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/*****************************************************************************
2112855Sgabeblack@google.com
2212855Sgabeblack@google.com  mixed.cpp --
2312855Sgabeblack@google.com
2412855Sgabeblack@google.com  Original Author: Martin Janssen, Synopsys, Inc., 2002-02-15
2512855Sgabeblack@google.com
2612855Sgabeblack@google.com *****************************************************************************/
2712855Sgabeblack@google.com
2812855Sgabeblack@google.com/*****************************************************************************
2912855Sgabeblack@google.com
3012855Sgabeblack@google.com  MODIFICATION LOG - modifiers, enter your name, affiliation, date and
3112855Sgabeblack@google.com  changes you are making here.
3212855Sgabeblack@google.com
3312855Sgabeblack@google.com      Name, Affiliation, Date:
3412855Sgabeblack@google.com  Description of Modification:
3512855Sgabeblack@google.com
3612855Sgabeblack@google.com *****************************************************************************/
3712855Sgabeblack@google.com
3812855Sgabeblack@google.com#include "systemc.h"
3912855Sgabeblack@google.com#include "isaac.h"
4012855Sgabeblack@google.com
4112855Sgabeblack@google.comQTIsaac<8> rng;
4212855Sgabeblack@google.com
4312855Sgabeblack@google.comSC_MODULE( adder )
4412855Sgabeblack@google.com{
4512855Sgabeblack@google.com    SC_HAS_PROCESS( adder );
4612855Sgabeblack@google.com
4712855Sgabeblack@google.com    sc_in<bool> clk;
4812855Sgabeblack@google.com    sc_in<int>  a;
4912855Sgabeblack@google.com    sc_in<int>  b;
5012855Sgabeblack@google.com    sc_out<int> sum;
5112855Sgabeblack@google.com
5212855Sgabeblack@google.com    adder( sc_module_name NAME,
5312855Sgabeblack@google.com           sc_clock& CLK,
5412855Sgabeblack@google.com           sc_signal<int>& A,
5512855Sgabeblack@google.com           sc_signal<int>& B,
5612855Sgabeblack@google.com           sc_signal<int>& SUM )
5712855Sgabeblack@google.com        : a(A), b(B), sum(SUM)
5812855Sgabeblack@google.com    {
5912855Sgabeblack@google.com        clk(CLK);
6012855Sgabeblack@google.com		SC_METHOD( entry );
6112855Sgabeblack@google.com        sensitive << clk;
6212855Sgabeblack@google.com        sensitive << a;
6312855Sgabeblack@google.com        sensitive << b;
6412855Sgabeblack@google.com    }
6512855Sgabeblack@google.com    void entry();
6612855Sgabeblack@google.com};
6712855Sgabeblack@google.com
6812855Sgabeblack@google.comvoid
6912855Sgabeblack@google.comadder::entry()
7012855Sgabeblack@google.com{
7112855Sgabeblack@google.com    if (clk.posedge()) {
7212855Sgabeblack@google.com        sum = a + b;
7312855Sgabeblack@google.com    }
7412855Sgabeblack@google.com}
7512855Sgabeblack@google.com
7612855Sgabeblack@google.comSC_MODULE( stim )
7712855Sgabeblack@google.com{
7812855Sgabeblack@google.com    SC_HAS_PROCESS( stim );
7912855Sgabeblack@google.com
8012855Sgabeblack@google.com    sc_in_clk   clk;
8112855Sgabeblack@google.com    sc_out<int> a;
8212855Sgabeblack@google.com    sc_out<int> b;
8312855Sgabeblack@google.com
8412855Sgabeblack@google.com    stim( sc_module_name NAME,
8512855Sgabeblack@google.com          sc_clock& CLK,
8612855Sgabeblack@google.com          sc_signal<int>& A,
8712855Sgabeblack@google.com          sc_signal<int>& B )
8812855Sgabeblack@google.com        : a(A), b(B)
8912855Sgabeblack@google.com    {
9012855Sgabeblack@google.com        clk(CLK);
9112855Sgabeblack@google.com		SC_CTHREAD( entry, clk.pos() );
9212855Sgabeblack@google.com    }
9312855Sgabeblack@google.com    void entry();
9412855Sgabeblack@google.com};
9512855Sgabeblack@google.com
9612855Sgabeblack@google.comvoid
9712855Sgabeblack@google.comstim::entry()
9812855Sgabeblack@google.com{
9912855Sgabeblack@google.com    while (true) {
10012855Sgabeblack@google.com        a = rng.rand() % 32768;
10112855Sgabeblack@google.com        b = rng.rand() % 32768;
10212855Sgabeblack@google.com        wait();
10312855Sgabeblack@google.com    }
10412855Sgabeblack@google.com}
10512855Sgabeblack@google.com
10612855Sgabeblack@google.comint
10712855Sgabeblack@google.comsc_main( int argc, char* argv[] )
10812855Sgabeblack@google.com{
10912855Sgabeblack@google.com    sc_signal<int> a("a");
11012855Sgabeblack@google.com    sc_signal<int> b("b");
11112855Sgabeblack@google.com    sc_signal<int> sum("sum");
11212855Sgabeblack@google.com    sc_clock clk("clk", 20, SC_NS);
11312855Sgabeblack@google.com
11412855Sgabeblack@google.com    a = 0;
11512855Sgabeblack@google.com    b = 0;
11612855Sgabeblack@google.com    sum = 0;
11712855Sgabeblack@google.com
11812855Sgabeblack@google.com    adder add("add", clk, a, b, sum);
11912855Sgabeblack@google.com    stim  sti("sti", clk, a, b);
12012855Sgabeblack@google.com
12112855Sgabeblack@google.com    sc_trace_file* tf = sc_create_wif_trace_file("mixed");
12212855Sgabeblack@google.com    sc_trace(tf, a, "a");
12312855Sgabeblack@google.com    sc_trace(tf, b, "b");
12412855Sgabeblack@google.com    sc_trace(tf, sum, "sum");
12512855Sgabeblack@google.com    sc_trace(tf, clk, "clk");
12612855Sgabeblack@google.com    sc_start(1000, SC_NS);
12712855Sgabeblack@google.com    sc_close_wif_trace_file( tf );
12812855Sgabeblack@google.com    return 0;
12912855Sgabeblack@google.com}
130