
/*****************************************************************************

  The following code is derived, directly or indirectly, from the SystemC
  source code Copyright (c) 1996-2014 by all Contributors.
  All Rights reserved.

  The contents of this file are subject to the restrictions and limitations
  set forth in the SystemC Open Source License (the "License");
  You may not use this file except in compliance with such restrictions and
  limitations. You may obtain instructions on how to receive a copy of the
  License at http://www.accellera.org/. Software distributed by Contributors
  under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
  ANY KIND, either express or implied. See the License for the specific
  language governing rights and limitations under the License.

 *****************************************************************************/

/*****************************************************************************

  sc_method_reset_throw.cpp -- 

  Original Author: Bishnupriya Bhattacharya, Cadence Design Systems, 2012-08-07

 *****************************************************************************/

#define SC_INCLUDE_DYNAMIC_PROCESSES
#include <systemc.h>

class my_exception
{
public:
  explicit my_exception(const char* s) : s_(s) { }
  const char* message() const { return s_.c_str(); }
protected:
  std::string s_;
};

SC_MODULE(sctop)
{
public:
   SC_CTOR(sctop)
   {
        SC_THREAD(run);
        SC_METHOD(m1); dont_initialize();
        method_handle = sc_get_current_process_handle();
        SC_THREAD(throwee1);
        throwee1_h = sc_get_current_process_handle();
   }

   void run() {
      wait (5, SC_NS);
      cout <<  sc_time_stamp() << ": reset method m1" << endl;
      method_handle.reset();
      cout <<  sc_time_stamp() << ": after reset of method m1" << endl;
   }

   void m1()
   {
      cout << sc_time_stamp() << ": in m1" << endl;
      cout << sc_time_stamp() << ": in m1() "
           << "throwing exception in throwee1" << endl;

      throwee1_h.throw_it(
         my_exception("thrown in throwee1 from m1()")
      );

      cout << sc_time_stamp() << ": in m1() "
           << "after throwing exception in throwee1" << endl;
  }

  void throwee1()
  {
    // catch exception and exit
    while (1) {
       try {
         wait(50, SC_NS);
         cerr << sc_time_stamp() << ": in throwee1, normal flow" << endl;
       }
       catch (my_exception const & x) {
         cerr << sc_time_stamp() << ": in throwee1, caught exception "
              << endl;
         return;
       }
    }
  }

protected:
  sc_process_handle method_handle;
  sc_process_handle throwee1_h;
};


int sc_main (int, char*[])
{
  sc_report_handler::set_actions( SC_ID_DISABLE_WILL_ORPHAN_PROCESS_, SC_DO_NOTHING );
  sctop top1("Top1");
  sc_start(10, SC_NS);
  return 0;
} 
