#`ifndef UVM_PHASE_DEFINES_SVH
#`define UVM_PHASE_DEFINES_SVH
#//
#//----------------------------------------------------------------------
#//   Copyright 2007-2011 Mentor Graphics Corporation
#//   Copyright 2007-2011 Cadence Design Systems, Inc. 
#//   Copyright 2011 Synopsys, Inc.
#//   All Rights Reserved Worldwide
#//
#//   Licensed 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.
#//----------------------------------------------------------------------
#
#
#// uvm_root.svh uses these macros to simplify creation of all the phases.
#// they are only to be used for UVM builtin phases, because they are simple
#// delegate imps that call the corresponding methods on uvm_component.
#// Also, they declare classes (uvm_XXXXX_phase) and singleton instances (XXXXX_ph)
#
#// If you require more complex phase functors for your custom phase, code your
#// own imp class extending uvm_task/topdown/bottomup_phase base classes, following
#// the pattern of the macros below, but customize the exec_task() or exec_func()
#// contents to suit your enhanced functionality or derived component type/methods.
#// The uvm_user_xxx_phase() macros are provided for your convenience.
#
#
#`define m_uvm_task_phase(PHASE,COMP,PREFIX) \
#        class PREFIX``PHASE``_phase extends uvm_task_phase; \
#          virtual task exec_task(uvm_component comp, uvm_phase phase); \
#            COMP comp_; \
#            if ($cast(comp_,comp)) \
#              comp_.``PHASE``_phase(phase); \
#          endtask \
#          local static PREFIX``PHASE``_phase m_inst; \
#          static const string type_name = `"PREFIX``PHASE``_phase`"; \
#          static function PREFIX``PHASE``_phase get(); \
#            if(m_inst == null) begin \
#              m_inst = new; \
#            end \
#            return m_inst; \
#          endfunction \
#          protected function new(string name=`"PHASE`"); \
#            super.new(name); \
#          endfunction \
#          virtual function string get_type_name(); \
#            return type_name; \
#          endfunction \
#        endclass \
#        //PREFIX``PHASE``_phase PREFIX``PHASE``_ph = PREFIX``PHASE``_phase::get();
#
#`define m_uvm_topdown_phase(PHASE,COMP,PREFIX) \
#        class PREFIX``PHASE``_phase extends uvm_topdown_phase; \
#          virtual function void exec_func(uvm_component comp, uvm_phase phase); \
#            COMP comp_; \
#            if ($cast(comp_,comp)) \
#              comp_.``PHASE``_phase(phase); \
#          endfunction \
#          local static PREFIX``PHASE``_phase m_inst; \
#          static const string type_name = `"PREFIX``PHASE``_phase`"; \
#          static function PREFIX``PHASE``_phase get(); \
#            if(m_inst == null) begin \
#              m_inst = new(); \
#            end \
#            return m_inst; \
#          endfunction \
#          protected function new(string name=`"PHASE`"); \
#            super.new(name); \
#          endfunction \
#          virtual function string get_type_name(); \
#            return type_name; \
#          endfunction \
#        endclass \
#        //PREFIX``PHASE``_phase PREFIX``PHASE``_ph = PREFIX``PHASE``_phase::get();
#
#`define m_uvm_bottomup_phase(PHASE,COMP,PREFIX) \
#        class PREFIX``PHASE``_phase extends uvm_bottomup_phase; \
#          virtual function void exec_func(uvm_component comp, uvm_phase phase); \
#            COMP comp_; \
#            if ($cast(comp_,comp)) \
#              comp_.``PHASE``_phase(phase); \
#          endfunction \
#          static PREFIX``PHASE``_phase m_inst; \
#          static const string type_name = `"PREFIX``PHASE``_phase`"; \
#          static function PREFIX``PHASE``_phase get(); \
#            if(m_inst == null) begin \
#              m_inst = new(); \
#            end \
#            return m_inst; \
#          endfunction \
#          protected function new(string name=`"PHASE`"); \
#            super.new(name); \
#          endfunction \
#          virtual function string get_type_name(); \
#            return type_name; \
#          endfunction \
#        endclass \
#        //PREFIX``PHASE``_phase PREFIX``PHASE``_ph = PREFIX``PHASE``_phase::get();
#
#`define uvm_builtin_task_phase(PHASE) \
#        `m_uvm_task_phase(PHASE,uvm_component,uvm_)
#
#`define uvm_builtin_topdown_phase(PHASE) \
#        `m_uvm_topdown_phase(PHASE,uvm_component,uvm_)
#
#`define uvm_builtin_bottomup_phase(PHASE) \
#        `m_uvm_bottomup_phase(PHASE,uvm_component,uvm_)
#
#
#`define uvm_user_task_phase(PHASE,COMP,PREFIX) \
#        `m_uvm_task_phase(PHASE,COMP,PREFIX)
#
#`define uvm_user_topdown_phase(PHASE,COMP,PREFIX) \
#        `m_uvm_topdown_phase(PHASE,COMP,PREFIX)
#
#`define uvm_user_bottomup_phase(PHASE,COMP,PREFIX) \
#        `m_uvm_bottomup_phase(PHASE,COMP,PREFIX)
#
#`endif
