simipc.h 3.93 KB
/*************************************************************************
 *
 *  File: simipc.h 
 *        This file contains definitions for the IPC structure and
 *	  debugging information
 *
 *  $Revision: 1.4 $
 *
 */

#ifndef _SIM_IPC_H_
#define _SIM_IPC_H_


/* General typedefs and definitions */

#define DEFAULT_NAME_PATH	"/tmp/.iosimipc.%s"

#define IPC_CLIENT	1
#define IPC_SERVER	2

/* SysCmd(1:0) single read request size */
#define	SYS_CMD_SRDSZ_1BYTE	0
#define SYS_CMD_SRDSZ_2BYTE	1	/* Half Word */
#define SYS_CMD_SRDSZ_3BYTE	2	/* Tri-Byte */
#define SYS_CMD_SRDSZ_4BYTE	3	/* Single Word */

/* SysCmd(1:0) block read request size */
#define	SYS_CMD_BRDSZ_2WORD	0
#define SYS_CMD_BRDSZ_4WORD	1
#define SYS_CMD_BRDSZ_8WORD	2

/* SysCmd(1:0) single write request size */
#define	SYS_CMD_SWRSZ_1BYTE	0
#define SYS_CMD_SWRSZ_2BYTE	1	/* Half Word */
#define SYS_CMD_SWRSZ_3BYTE	2	/* Tri-Byte */
#define SYS_CMD_SWRSZ_4BYTE	3	/* Single Word */

/* SysCmd(1:0) block write request size */
#define SYS_CMD_BWRSZ_2WORD	0
#define SYS_CMD_BWRSZ_4WORD	1
#define SYS_CMD_BWRSZ_8WORD	2

/* Request codes */
#define	REQ_SINGLE_READ		1
#define	REQ_SINGLE_WRITE	2
#define	REQ_BLOCK_READ		3
#define	REQ_BLOCK_WRITE		4
#define	REQ_STALL			5
#define	REQ_CONFIG_RDRAM	6
#define	REQ_RUN_TEST		7
#define	REQ_QUIT			100

#define	REQ_LOAD			REQ_SINGLE_READ
#define	REQ_STORE			REQ_SINGLE_WRITE

#define DIR_SINGLE_LOAD		REQ_SINGLE_READ
#define DIR_SINGLE_STORE	REQ_SINGLE_WRITE
#define DIR_BLOCK_LOAD		REQ_BLOCK_READ
#define DIR_BLOCK_STORE		REQ_BLOCK_WRITE

#define	SIZE_1BYTE			SYS_CMD_SRDSZ_1BYTE
#define	SIZE_2BYTE			SYS_CMD_SRDSZ_2BYTE
#define	SIZE_3BYTE			SYS_CMD_SRDSZ_3BYTE
#define	SIZE_4BYTE			SYS_CMD_SRDSZ_4BYTE

#define	SIZE_2WORD			SYS_CMD_BRDSZ_2WORD
#define	SIZE_4WORD			SYS_CMD_BRDSZ_4WORD
#define	SIZE_8WORD			SYS_CMD_BRDSZ_8WORD

/* Request size codes */
#define	REQ_SZ_BYTE			1
#define	REQ_SZ_HALF			2
#define	REQ_SZ_3BYTE		3
#define	REQ_SZ_WORD			4
#define	REQ_SZ_DWORD		8

/* Response codes */
#define	RSP_OK				1
#define	RSP_DATA			2
#define	RSP_LOAD			3
#define	RSP_STORE			4
#define	RSP_ERROR			100

/* IPC types */
#define IPC_CLIENT			1
#define IPC_SERVER			2


/* Offset to packet structure */
#define	PKT_LEN_OFS			0
#define	PKT_CODE_OFS		1
#define	PKT_SIZE_OFS		2
#define	PKT_ADDR_OFS		3
#define	PKT_DATA_OFS		4

/* Request size codes */
#define	PKT_DATA_WORD	8			/* 8 words */
#define	PKT_DATA_BYTES	(PKT_DATA_WORD*4)	/* 4 bytes * 8 */

/* IPC packet structure for both request/response */
/* Adding xz value here.
   The basic logic:
       
   data          0     1    0    1
   xz            0     0    1    1
   Real Value    0     1    z    x

   In this data structure, the first 8 words will be data itself,
   and the second half will be 8 words xz value 

*/
typedef struct _IpcPktStruct {
        unsigned int    length;
        unsigned int	code;
        unsigned int	size;
        unsigned int    address;
        unsigned int    data[PKT_DATA_WORD<<1];
} IpcPkt;


/*
#define	LFP(a)		((a)?(a):stderr)
*/

#ifndef PLI
extern	int	IpcInit(char *);
extern	int	IpcOpen(int);
extern	int	IpcAccept(int);
extern	int	IpcConnect(int);
extern	int	IpcClose(int);
extern	int	IpcSend(int, char *, int);
extern	int	IpcReceive(int, char *, int);
#endif

/*  We use Global variable(keep_alive_socker) to control if we need 
    persist TCP connection between Verilog server and IOSIM/IORAND

    if keep_alive_socket != -1, then IpcOpen will not open the new socket,
    instead return keep_alive_socket as newly opened socket. For IpcClose,
    will not close the socket either.

    if keep_alive_socket == -1, it will be back to old socket communication
    (open/ close the socket for each request.)
 */

extern  int     keep_alive_socket;

/*  MIPS Interrupt */
extern int interrupt_vector;
extern int debug_interrupt ;
#ifdef BCP_IPC
	#define DISABLE_INTERRUPT
	#define CHECK_INTERRUPT  (interrupt_vector)  
	#define CHECK_DBUG_INTERRUPT	(debug_interrupt)
#else
#endif

#endif  /* _SIM_IPC_H_ */