/* 
 * Customer ID=11656; Build=0x5f626; Copyright (c) 2009-2013 by Tensilica Inc.  ALL RIGHTS RESERVED.
 * These coded instructions, statements, and computer programs are the
 * copyrighted works and confidential proprietary information of
 * Tensilica Inc.  They may be adapted and modified by bona fide
 * purchasers for internal use, but neither the original nor any
 * adapted or modified version may be disclosed or distributed to
 * third parties in any manner, medium, or form, in whole or in part,
 * without the prior written consent of Tensilica Inc.
 *
 * This software and its derivatives are to be executed solely on
 * products incorporating a Tensilica processor.
 */

// Utility routines for returning pass/fail status in HW simulations

#ifndef XT_REF_TESTBENCH_H
#define XT_REF_TESTBENCH_H 1

#ifdef __cplusplus
extern "C" {
#endif

// Exit routines for HW simulation
extern int diag_pass();
extern int diag_fail();

// Set exit status for HW simulation
int set_diag_status(int stat);

// Setup for user power toggling
extern int setup_power_toggle();

// Return exit status location
extern unsigned int* testbench_exit_location();
// Return power toggle location
extern unsigned int* testbench_power_toggle_location();


// Change exit status location
// You must also change the plusarg "+DVMagicExit" sent to the HW simulator
// or change the argument "--exit_location" sent to the ISS
extern unsigned int* set_testbench_exit_location(unsigned int*);
// Change power toggle location
// You must also change the plusarg "+DVPowerLoc" sent to the HW simulator
extern unsigned int* set_testbench_power_toggle_location(unsigned int*);

// Exit routines with status message
//
static inline
int pass(const char *msg) 
{
  return diag_pass();
}

static inline
int fail(const char *msg) 
{
  return diag_fail();
}

#define POWER_TOGGLE_ON 1
#define POWER_TOGGLE_OFF 0

// Routine to turn on and off power toggle
//   Does a magic write that Monitors.v intercepts and appropriately turns 
//   SAIF dumping on and offf
//   
extern volatile unsigned int *_reftb_power_toggle;

__attribute__ ((always_inline))
static inline
int set_power_toggle(int val) 
{
#ifdef __XTENSA__
  *_reftb_power_toggle = val;
#endif
  return val;
}

#ifdef __cplusplus
}
#endif

#endif // XT_REF_TESTBENCH_H