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  new_prop1.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
4012855Sgabeblack@google.comstatic int (*print_func)(const char*, ...);
4112855Sgabeblack@google.com
4212855Sgabeblack@google.comstruct new_prop : sc_module {
4312855Sgabeblack@google.com    sc_in<bool> i[16];
4412855Sgabeblack@google.com
4512855Sgabeblack@google.com    void my_print(const char*);
4612855Sgabeblack@google.com
4712855Sgabeblack@google.com    void async0() { my_print("async0"); }
4812855Sgabeblack@google.com    void async1() { my_print("async1"); }
4912855Sgabeblack@google.com    void async2() { my_print("async2"); }
5012855Sgabeblack@google.com    void async3() { my_print("async3"); }
5112855Sgabeblack@google.com
5212855Sgabeblack@google.com    void aproc0() { wait(); while (1) { my_print("aproc0"); wait(); } }
5312855Sgabeblack@google.com    void aproc1() { wait(); while (1) { my_print("aproc1"); wait(); } }
5412855Sgabeblack@google.com    void aproc2() { wait(); while (1) { my_print("aproc2"); wait(); } }
5512855Sgabeblack@google.com    void aproc3() { wait(); while (1) { my_print("aproc3"); wait(); } }
5612855Sgabeblack@google.com
5712855Sgabeblack@google.com    SC_CTOR(new_prop) {
5812855Sgabeblack@google.com        SC_METHOD(async0);
5912855Sgabeblack@google.com        sensitive << i[4].neg();
6012855Sgabeblack@google.com        sensitive << i[12].neg();
6112855Sgabeblack@google.com        sensitive << i[13].neg();
6212855Sgabeblack@google.com        sensitive << i[14].neg();
6312855Sgabeblack@google.com        sensitive << i[15].neg();
6412855Sgabeblack@google.com
6512855Sgabeblack@google.com        SC_METHOD(async1);
6612855Sgabeblack@google.com        sensitive << i[1].pos();
6712855Sgabeblack@google.com        sensitive << i[5].pos();
6812855Sgabeblack@google.com        sensitive << i[7].pos();
6912855Sgabeblack@google.com        sensitive << i[9].pos();
7012855Sgabeblack@google.com
7112855Sgabeblack@google.com        SC_METHOD(async2);
7212855Sgabeblack@google.com        sensitive << i[5].neg();
7312855Sgabeblack@google.com        sensitive << i[6].neg();
7412855Sgabeblack@google.com        sensitive << i[13].pos();
7512855Sgabeblack@google.com        sensitive << i[15].pos();
7612855Sgabeblack@google.com
7712855Sgabeblack@google.com        SC_METHOD(async3);
7812855Sgabeblack@google.com        sensitive << i[3].pos();
7912855Sgabeblack@google.com        sensitive << i[5].neg();
8012855Sgabeblack@google.com        sensitive << i[7].neg();
8112855Sgabeblack@google.com        sensitive << i[11].pos();
8212855Sgabeblack@google.com
8312855Sgabeblack@google.com        SC_THREAD(aproc0);
8412855Sgabeblack@google.com        sensitive << i[2].pos();
8512855Sgabeblack@google.com
8612855Sgabeblack@google.com        SC_THREAD(aproc1);
8712855Sgabeblack@google.com        sensitive << i[3].pos();
8812855Sgabeblack@google.com        sensitive << i[12].neg();
8912855Sgabeblack@google.com        sensitive << i[13].neg();
9012855Sgabeblack@google.com        sensitive << i[14].neg();
9112855Sgabeblack@google.com        sensitive << i[15].neg();
9212855Sgabeblack@google.com
9312855Sgabeblack@google.com        SC_THREAD(aproc2);
9412855Sgabeblack@google.com        sensitive << i[8].neg();
9512855Sgabeblack@google.com        sensitive << i[9].neg();
9612855Sgabeblack@google.com        sensitive << i[10].neg();
9712855Sgabeblack@google.com        sensitive << i[11].neg();
9812855Sgabeblack@google.com
9912855Sgabeblack@google.com        SC_THREAD(aproc3);
10012855Sgabeblack@google.com        sensitive << i[6].pos();
10112855Sgabeblack@google.com        sensitive << i[7].pos();
10212855Sgabeblack@google.com        sensitive << i[10].pos();
10312855Sgabeblack@google.com        sensitive << i[11].pos();
10412855Sgabeblack@google.com        sensitive << i[14].pos();
10512855Sgabeblack@google.com        sensitive << i[15].pos();
10612855Sgabeblack@google.com    }
10712855Sgabeblack@google.com};
10812855Sgabeblack@google.com
10912855Sgabeblack@google.comvoid
11012855Sgabeblack@google.comnew_prop::my_print(const char* p)
11112855Sgabeblack@google.com{
11212855Sgabeblack@google.com    (*print_func)("%s executed on:\n", p);
11312855Sgabeblack@google.com    for (int j = 0; j < 16; ++j) {
11412855Sgabeblack@google.com        if (i[j].posedge()) {
11512855Sgabeblack@google.com            (*print_func)("\tposedge i[%d]\n", j);
11612855Sgabeblack@google.com        }
11712855Sgabeblack@google.com        if (i[j].negedge()) {
11812855Sgabeblack@google.com            (*print_func)("\tnegedge i[%d]\n", j);
11912855Sgabeblack@google.com        }
12012855Sgabeblack@google.com    }
12112855Sgabeblack@google.com}
12212855Sgabeblack@google.com
12312855Sgabeblack@google.comstatic int
12412855Sgabeblack@google.comdont_print(const char* fmt, ...)
12512855Sgabeblack@google.com{
12612855Sgabeblack@google.com    return 0;
12712855Sgabeblack@google.com}
12812855Sgabeblack@google.com
12912855Sgabeblack@google.comint
13012855Sgabeblack@google.comsc_main(int,char**)
13112855Sgabeblack@google.com{
13212855Sgabeblack@google.com    sc_signal<bool> i[16];
13312855Sgabeblack@google.com
13412855Sgabeblack@google.com    new_prop np("np");
13512855Sgabeblack@google.com
13612855Sgabeblack@google.com    for( int j = 0; j < 16; ++ j ) {
13712855Sgabeblack@google.com        np.i[j]( i[j] );
13812855Sgabeblack@google.com    }
13912855Sgabeblack@google.com
14012855Sgabeblack@google.com    for (int j = 0; j < 16; ++j) {
14112855Sgabeblack@google.com        i[j] = 0;
14212855Sgabeblack@google.com    }
14312855Sgabeblack@google.com
14412855Sgabeblack@google.com    print_func = &dont_print;
14512855Sgabeblack@google.com    sc_start(0, SC_NS);
14612855Sgabeblack@google.com
14712855Sgabeblack@google.com    print_func = &printf;
14812855Sgabeblack@google.com
14912855Sgabeblack@google.com    for (int k = 0; k < 16; ++k) {
15012855Sgabeblack@google.com        i[k] = ! i[k].read();
15112855Sgabeblack@google.com        sc_start(1, SC_NS);
15212855Sgabeblack@google.com        i[k] = ! i[k].read();
15312855Sgabeblack@google.com        sc_start(1, SC_NS);
15412855Sgabeblack@google.com    }
15512855Sgabeblack@google.com
15612855Sgabeblack@google.com    fflush( stdout );
15712855Sgabeblack@google.com
15812855Sgabeblack@google.com    return 0;
15912855Sgabeblack@google.com}
160