/*  This file is part of the program psim.

    Copyright (C) 1994-1997, Andrew Cagney <cagney@highland.com.au>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, see <http://www.gnu.org/licenses/>.
 
    */


#ifndef _DEBUG_H_
#define _DEBUG_H_

#include "filter_filename.h"

typedef enum {
  trace_invalid,
  trace_tbd,
  /**/
  trace_gdb,
  trace_os_emul,
  /**/
  trace_events,
  trace_device_tree,
  trace_devices,
  trace_binary_device,
  trace_com_device,
  trace_console_device,
  trace_core_device,
  trace_disk_device,
  trace_eeprom_device,
  trace_file_device,
  trace_glue_device,
  trace_halt_device,
  trace_htab_device,
  trace_icu_device,
  trace_ide_device,
  trace_memory_device,
  trace_opic_device,
  trace_pal_device,
  trace_pass_device,
  trace_phb_device,
  trace_sem_device,
  trace_shm_device,
  trace_stack_device,
  trace_register_device,
  trace_vm_device,
  /**/
  trace_disklabel_package,
  /**/
  trace_semantics,
  trace_idecode,
  trace_alu,
  trace_load_store,
  trace_model,
  /**/
  trace_vm,
  trace_core,
  trace_interrupts,
  trace_psim,
  trace_device_init,
  trace_cpu,
  trace_breakpoint,
  trace_opts,
  trace_print_info,
  trace_print_device_tree,
  trace_dump_device_tree,
  nr_trace_options
} trace_options;



extern int ppc_trace[nr_trace_options];

/* simple */
#define TRACE(OBJECT, ARGS) \
do { \
  if (WITH_TRACE) { \
    if (ppc_trace[OBJECT]) { \
      sim_io_printf_filtered("%s:%d: ", filter_filename(__FILE__), __LINE__); \
      sim_io_printf_filtered ARGS; \
    } \
  } \
} while (0)

/* issue */
#define ITRACE(OBJECT, ARGS) \
do { \
  if (WITH_TRACE) { \
    if (ppc_trace[OBJECT]) { \
      sim_io_printf_filtered("%s:%d:0x%08lx:%s ", itable[MY_INDEX].file, itable[MY_INDEX].line_nr, (long)cia, itable[MY_INDEX].name); \
      sim_io_printf_filtered ARGS; \
    } \
  } \
} while (0)

/* device */
#define DTRACE(OBJECT, ARGS) \
do { \
  if (WITH_TRACE) { \
    int trace_device = device_trace(me); \
    if (ppc_trace[trace_devices] \
	|| ppc_trace[trace_##OBJECT##_device] \
	|| trace_device) { \
      sim_io_printf_filtered("%s:%d:%s:%s%s ",					\
			     filter_filename(__FILE__), __LINE__, #OBJECT, \
			     trace_device ? device_path(me) : "",	\
			     trace_device ? ":" : "");			\
      sim_io_printf_filtered ARGS; \
    } \
  } \
} while (0)

/* device instance */
#define DITRACE(OBJECT, ARGS) \
do { \
  if (WITH_TRACE) { \
    device *me = device_instance_device(instance); \
    int trace_device = device_trace(me); \
    if (ppc_trace[trace_devices] \
	|| ppc_trace[trace_##OBJECT##_device] \
	|| trace_device) { \
      sim_io_printf_filtered("%s:%d:%s:%s%s ", \
			     filter_filename(__FILE__), __LINE__, #OBJECT, \
			     trace_device ? device_path(me) : "",	\
			     trace_device ? ":" : "");			\
      sim_io_printf_filtered ARGS; \
    } \
  } \
} while (0)

/* package */
#define PTRACE(OBJECT, ARGS) \
do { \
  if (WITH_TRACE) { \
    if (ppc_trace[trace_##OBJECT##_package]) { \
      sim_io_printf_filtered("%s:%d:%s: ", filter_filename(__FILE__), __LINE__, #OBJECT); \
      sim_io_printf_filtered ARGS; \
    } \
  } \
} while (0)


#define ASSERT(EXPRESSION) \
do { \
  if (WITH_ASSERT) { \
    if (!(EXPRESSION)) { \
      error("%s:%d: assertion failed - %s\n", \
	    filter_filename(__FILE__), __LINE__, #EXPRESSION); \
    } \
  } \
} while (0)

/* Parse OPTION updating the trace array */
extern void
trace_option(const char *option, int setting);

/* Output the list of trace options */
extern void trace_usage
(int verbose);

/* TODO: These values aren't currently used by the ppc port.  They're here to
   glue the common sim compile-time settings in.  The ppc_trace settings above
   would need to be overhauled.  */
#define TRACE_insn     1
#define TRACE_disasm   1
#define TRACE_decode   1
#define TRACE_extract  1
#define TRACE_linenum  1
#define TRACE_memory   1
#define TRACE_model    1
#define TRACE_alu      1
#define TRACE_core     1
#define TRACE_events   1
#define TRACE_fpu      1
#define TRACE_vpu      1
#define TRACE_branch   1
#define TRACE_syscall  1
#define TRACE_register 1
#define TRACE_debug    1

#endif /* _DEBUG_H_ */
