/*
 * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * Generated by pegen
 * Version 1.1
 * Virage Logic (c) 2009
 * This is a generated file. All manual edits will be lost.
 */

#ifndef _ENET_APP_H
#define _ENET_APP_H 1

#ifdef __cplusplus
extern "C" {
#endif

/*
Register offset definitions for ENET on bus memIntf
*/
#define ENET_CONTROL_offset  0x0000 /* read-write, width=32 */
#define ENET_STATUS_offset   0x0004 /* read-only, width=32 */
#define ENET_TX_SIZE_offset  0x0008 /* read-write, width=32 */
#define ENET_TX_BUFFER_offset 0x000c /* read-write, width=32 */
#define ENET_RX_SIZE_offset  0x0010 /* read-write, width=32 */
#define ENET_RX_BUFFER_offset 0x0014 /* read-write, width=32 */
#define ENET_INTERRUPT_CONFIGURATION_offset 0x0018 /* read-write, width=32 */

/*-------------------------------------------------------------------------*/
/* Bit definitions for control field of the ethernet device */

/* Write this bit to request initialization */
#define EMWSIM_CONTROL_INITIALIZE    (0x0001)

/*
** Write this bit to enable (1) or disable(0) the device interrupts
** The device interrupts on a read or write completion.
** The interrupt is automatically cleared
*/
#define EMWSIM_CONTROL_INT_ENABLE    (0x0002)

/* Write this bit to deinstall the device */
#define EMWSIM_CONTROL_SHUTDOWN      (0x0004)

/* Write this bit to tell the device to transmit */
#define EMWSIM_CONTROL_TRANSMIT      (0x0008)

/* Write this bit to reset the RX Available bit in the status register */
#define EMWSIM_CONTROL_RECEIVED      (0x0010)

/* Write this bit when read to read a packet */
#define EMWSIM_CONTROL_READY_TO_RX   (0x0020)


/*-------------------------------------------------------------------------*/
/* Bit definitions for status field of the ethernet device */

/* The device is initialized */
#define EMWSIM_STATUS_INITIALIZED   (0x0001)

/* The device is able to transmit */
#define EMWSIM_STATUS_TX_AVAILABLE  (0x0002)

/* The device has received a packet */
#define EMWSIM_STATUS_RX_RECEIVED   (0x0004)




/*
Register structure definitions for peripheral ENET on bus memIntf
*/

/*
** EMWSIM STRUCT
** This structure defines what the registers of the simulator ethernet
** device look like.
*/
typedef struct emwsim_struct {

   /* The control register */
   unsigned int CONTROL;

   /* The status register */
   unsigned int STATUS;

   /*
   ** If STATUS & TX_AVAILABLE, and you write CONTROL_TRANSMIT to the
   ** CONTROL register, the device will transmit the packed pointed to
   ** by TX_BUFFER for TX_SIZE.  During transmission, TX_AVAILABLE is
   ** is NOT set in STATUS; at completion of transmission, it is set,
   ** indicating we can transmit again.
   ** Upon completion of transmission, if CONTROL & INTERRUPT_ENABLE,
   ** an interrupt is attempted.
   */
   unsigned int TX_SIZE;
   unsigned char * TX_BUFFER;

   /*
   ** If CONTROL & RX_READY, the device is allowed to receive
   ** an ethernet packet.  It writes the packet to the address in RX_BUFFER
   ** puts its length in RX_SIZE, and sets RX_AVAILABLE in the STATUS
   ** register.  If CONTROL & INTERRUPT_ENABLE, an interrupt
   ** is attempted.
   ** If RX_BUFFER is null, the packet is discarded, and no other changes
   ** are made.
   */
   unsigned int RX_SIZE;
   unsigned char * RX_BUFFER;

   /*
   ** This is the interrupt configuration of the device.
   ** The upper 16 bits is the level (1 or 2)
   ** and the lower 16 bits is the vector.
   ** The default for the device is level 2, vector 6.
   ** This is set up when the device is configured and does not change.
   ** The device driver can read this register to determine how to
   ** catch the interrupt.
   */
   unsigned int INTERRUPT_CONFIGURATION;

};



/*
 Register CONTROL
 Description: Control Register
 */
struct ENET_CONTROL_struct {
    unsigned INITIALIZE : 1; /* bit 0, read-write */
        /* Write this bit to request initialization */
    unsigned INT_ENABLE : 1; /* bit 1, read-write */
        /* Write 1 to enable interrupts and 0 to disable. */
    unsigned SHUTDOWN : 1; /* bit 2, read-write */
        /* Write this bit to de-install the device */
    unsigned TRANSMIT : 1; /* bit 3, read-write */
        /* Write this bit to tell the device to transmit */
    unsigned RECEIVED : 1; /* bit 4, read-write */
        /* Write this bit to reset the RX Available bit in the status register */
    unsigned READY_TO_RX : 1; /* bit 5, read-write */
        /* Write this bit when ready to read a packet */
    unsigned reserved6 : 26; /* bits 6..31, read-only */
        /* reserved */
};

/*
 Register STATUS
 Description: Status Register
 */
struct ENET_STATUS_struct {
    unsigned INITIALIZED : 1; /* bit 0, read-only */
        /* The device is initialized */
    unsigned TX_AVAILABLE : 1; /* bit 1, read-only */
        /* The device is able to transmit */
    unsigned RX_RECEIVED : 1; /* bit 2, read-only */
        /* The device has received a packet */
    unsigned reserved3 : 29; /* bits 3..31, read-only */
        /* reserved */
};

/*
 Register TX_SIZE
 Description: TX Size Register
 */
struct ENET_TX_SIZE_struct {
    unsigned TX_SIZE : 32; /* bits 0..31, read-write */
        /* Total size of packet to transmit (bytes) */
};

/*
 Register TX_BUFFER
 Description: TX Buffer Register
 */
struct ENET_TX_BUFFER_struct {
    unsigned TX_BUFFER : 32; /* bits 0..31, read-write */
        /* Pointer to the packet fragment to transmit */
};

/*
 Register RX_SIZE
 Description: RX Size Register
 */
struct ENET_RX_SIZE_struct {
    unsigned RX_SIZE : 32; /* bits 0..31, read-write */
        /* Largest size a received packet can be (bytes) */
};

/*
 Register RX_BUFFER
 Description: RX Buffer Register
 */
struct ENET_RX_BUFFER_struct {
    unsigned RX_BUFFER : 32; /* bits 0..31, read-write */
        /* Pointer to the place to put the packet when received */
};

/*
 Register INTERRUPT_CONFIGURATION
 Description: Interrupt Configuration Register
 */
struct ENET_INTERRUPT_CONFIGURATION_struct {
    unsigned VECTOR : 16; /* bits 0..15, read-write */
        /* Interrupt Vector (default 6) */
    unsigned LEVEL : 16; /* bits 16..31, read-write */
        /* Interrupt Level (1 or 2) (default 2) */
};


/*
Register accessor functions for peripheral ENET on bus memIntf
*/

/*
 Register CONTROL
 Description: Control Register
 */

static __inline__ unsigned int
READ_ENET_CONTROL_INITIALIZE(unsigned int base)
{
    volatile unsigned int *p = (volatile unsigned int *)(base + ENET_CONTROL_offset);
    unsigned int val = *p; /* i/o read */
    return (unsigned int)((val >> 0) & 0x00000001);
}

static __inline__ void
WRITE_ENET_CONTROL_INITIALIZE(unsigned int base, unsigned int val)
{
    volatile unsigned int *p = (volatile unsigned int *)(base + ENET_CONTROL_offset);
    unsigned int v = *p; /* i/o read */
    v &= ~0x00000001;
    v |= ((val << 0) & 0x00000001);
    *p = v; /* i/o write */
}

static __inline__ unsigned int
READ_ENET_CONTROL_INT_ENABLE(unsigned int base)
{
    volatile unsigned int *p = (volatile unsigned int  *)(base + ENET_CONTROL_offset);
    unsigned int val = *p; /* i/o read */
    return (unsigned int)((val >> 1) & 0x00000001);
}

static __inline__ void
WRITE_ENET_CONTROL_INT_ENABLE(unsigned int base, unsigned int val)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_CONTROL_offset);
    unsigned int v = *p; /* i/o read */
    v &= ~0x00000002;
    v |= ((val << 1) & 0x00000002);
    *p = v; /* i/o write */
}

static __inline__ unsigned int
READ_ENET_CONTROL_SHUTDOWN(unsigned int base)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_CONTROL_offset);
    unsigned int val = *p; /* i/o read */
    return (unsigned int)((val >> 2) & 0x00000001);
}

static __inline__ void
WRITE_ENET_CONTROL_SHUTDOWN(unsigned int base, unsigned int val)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_CONTROL_offset);
    unsigned int v = *p; /* i/o read */
    v &= ~0x00000004;
    v |= ((val << 2) & 0x00000004);
    *p = v; /* i/o write */
}

static __inline__ unsigned int
READ_ENET_CONTROL_TRANSMIT(unsigned int base)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_CONTROL_offset);
    unsigned int val = *p; /* i/o read */
    return (unsigned int)((val >> 3) & 0x00000001);
}

static __inline__ void
WRITE_ENET_CONTROL_TRANSMIT(unsigned int base, unsigned int val)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_CONTROL_offset);
    unsigned int v = *p; /* i/o read */
    v &= ~0x00000008;
    v |= ((val << 3) & 0x00000008);
    *p = v; /* i/o write */
}

static __inline__ unsigned int
READ_ENET_CONTROL_RECEIVED(unsigned int base)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_CONTROL_offset);
    unsigned int val = *p; /* i/o read */
    return (unsigned int)((val >> 4) & 0x00000001);
}

static __inline__ void
WRITE_ENET_CONTROL_RECEIVED(unsigned int base, unsigned int val)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_CONTROL_offset);
    unsigned int v = *p; /* i/o read */
    v &= ~0x00000010;
    v |= ((val << 4) & 0x00000010);
    *p = v; /* i/o write */
}

static __inline__ unsigned int
READ_ENET_CONTROL_READY_TO_RX(unsigned int base)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_CONTROL_offset);
    unsigned int val = *p; /* i/o read */
    return (unsigned int)((val >> 5) & 0x00000001);
}

static __inline__ void
WRITE_ENET_CONTROL_READY_TO_RX(unsigned int base, unsigned int val)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_CONTROL_offset);
    unsigned int v = *p; /* i/o read */
    v &= ~0x00000020;
    v |= ((val << 5) & 0x00000020);
    *p = v; /* i/o write */
}

static __inline__ unsigned int
READ_ENET_CONTROL_reserved6(unsigned int base)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_CONTROL_offset);
    unsigned int val = *p; /* i/o read */
    return (unsigned int)((val >> 6) & 0x03ffffff);
}

static __inline__ unsigned int
READ_ENET_CONTROL(unsigned int base)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_CONTROL_offset);
    unsigned int val = *p; /* i/o read */
    return val;
}

static __inline__ void
WRITE_ENET_CONTROL(unsigned int base, unsigned int val)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_CONTROL_offset);
    *p = val; /* i/o write */
}


/*
 Register STATUS
 Description: Status Register
 */

static __inline__ unsigned int
READ_ENET_STATUS_INITIALIZED(unsigned int base)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_STATUS_offset);
    unsigned int val = *p; /* i/o read */
    return (unsigned int)((val >> 0) & 0x00000001);
}

static __inline__ unsigned int
READ_ENET_STATUS_TX_AVAILABLE(unsigned int base)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_STATUS_offset);
    unsigned int val = *p; /* i/o read */
    return (unsigned int)((val >> 1) & 0x00000001);
}

static __inline__ unsigned int
READ_ENET_STATUS_RX_RECEIVED(unsigned int base)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_STATUS_offset);
    unsigned int val = *p; /* i/o read */
    return (unsigned int)((val >> 2) & 0x00000001);
}

static __inline__ unsigned int
READ_ENET_STATUS_reserved3(unsigned int base)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_STATUS_offset);
    unsigned int val = *p; /* i/o read */
    return (unsigned int)((val >> 3) & 0x1fffffff);
}

static __inline__ unsigned int
READ_ENET_STATUS(unsigned int base)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_STATUS_offset);
    unsigned int val = *p; /* i/o read */
    return val;
}


/*
 Register TX_SIZE
 Description: TX Size Register
 */

static __inline__ unsigned int
READ_ENET_TX_SIZE_TX_SIZE(unsigned int base)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_TX_SIZE_offset);
    unsigned int val = *p; /* i/o read */
    return val;
}

static __inline__ void
WRITE_ENET_TX_SIZE_TX_SIZE(unsigned int base, unsigned int val)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_TX_SIZE_offset);
    *p = val; /* i/o write */
}

static __inline__ unsigned int
READ_ENET_TX_SIZE(unsigned int base)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_TX_SIZE_offset);
    unsigned int val = *p; /* i/o read */
    return val;
}

static __inline__ void
WRITE_ENET_TX_SIZE(unsigned int base, unsigned int val)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_TX_SIZE_offset);
    *p = val; /* i/o write */
}


/*
 Register TX_BUFFER
 Description: TX Buffer Register
 */

static __inline__ unsigned int
READ_ENET_TX_BUFFER_TX_BUFFER(unsigned int base)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_TX_BUFFER_offset);
    unsigned int val = *p; /* i/o read */
    return val;
}

static __inline__ void
WRITE_ENET_TX_BUFFER_TX_BUFFER(unsigned int base, unsigned int val)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_TX_BUFFER_offset);
    *p = val; /* i/o write */
}

static __inline__ unsigned int
READ_ENET_TX_BUFFER(unsigned int base)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_TX_BUFFER_offset);
    unsigned int val = *p; /* i/o read */
    return val;
}

static __inline__ void
WRITE_ENET_TX_BUFFER(unsigned int base, unsigned int val)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_TX_BUFFER_offset);
    *p = val; /* i/o write */
}


/*
 Register RX_SIZE
 Description: RX Size Register
 */

static __inline__ unsigned int
READ_ENET_RX_SIZE_RX_SIZE(unsigned int base)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_RX_SIZE_offset);
    unsigned int val = *p; /* i/o read */
    return val;
}

static __inline__ void
WRITE_ENET_RX_SIZE_RX_SIZE(unsigned int base, unsigned int val)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_RX_SIZE_offset);
    *p = val; /* i/o write */
}

static __inline__ unsigned int
READ_ENET_RX_SIZE(unsigned int base)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_RX_SIZE_offset);
    unsigned int val = *p; /* i/o read */
    return val;
}

static __inline__ void
WRITE_ENET_RX_SIZE(unsigned int base, unsigned int val)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_RX_SIZE_offset);
    *p = val; /* i/o write */
}


/*
 Register RX_BUFFER
 Description: RX Buffer Register
 */

static __inline__ unsigned int
READ_ENET_RX_BUFFER_RX_BUFFER(unsigned int base)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_RX_BUFFER_offset);
    unsigned int val = *p; /* i/o read */
    return val;
}

static __inline__ void
WRITE_ENET_RX_BUFFER_RX_BUFFER(unsigned int base, unsigned int val)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_RX_BUFFER_offset);
    *p = val; /* i/o write */
}

static __inline__ unsigned int
READ_ENET_RX_BUFFER(unsigned int base)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_RX_BUFFER_offset);
    unsigned int val = *p; /* i/o read */
    return val;
}

static __inline__ void
WRITE_ENET_RX_BUFFER(unsigned int base, unsigned int val)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_RX_BUFFER_offset);
    *p = val; /* i/o write */
}


/*
 Register INTERRUPT_CONFIGURATION
 Description: Interrupt Configuration Register
 */

static __inline__ unsigned int
READ_ENET_INTERRUPT_CONFIGURATION_VECTOR(unsigned int base)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_INTERRUPT_CONFIGURATION_offset);
    unsigned int val = *p; /* i/o read */
    return (unsigned int)((val >> 0) & 0x0000ffff);
}

static __inline__ void
WRITE_ENET_INTERRUPT_CONFIGURATION_VECTOR(unsigned int base, unsigned int val)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_INTERRUPT_CONFIGURATION_offset);
    unsigned int v = *p; /* i/o read */
    v &= ~0x0000ffff;
    v |= ((val << 0) & 0x0000ffff);
    *p = v; /* i/o write */
}

static __inline__ unsigned int
READ_ENET_INTERRUPT_CONFIGURATION_LEVEL(unsigned int base)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_INTERRUPT_CONFIGURATION_offset);
    unsigned int val = *p; /* i/o read */
    return (unsigned int)((val >> 16) & 0x0000ffff);
}

static __inline__ void
WRITE_ENET_INTERRUPT_CONFIGURATION_LEVEL(unsigned int base, unsigned int val)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_INTERRUPT_CONFIGURATION_offset);
    unsigned int v = *p; /* i/o read */
    v &= ~0xffff0000;
    v |= ((val << 16) & 0xffff0000);
    *p = v; /* i/o write */
}

static __inline__ unsigned int
READ_ENET_INTERRUPT_CONFIGURATION(unsigned int base)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_INTERRUPT_CONFIGURATION_offset);
    unsigned int val = *p; /* i/o read */
    return val;
}

static __inline__ void
WRITE_ENET_INTERRUPT_CONFIGURATION(unsigned int base, unsigned int val)
{
    volatile unsigned int  *p = (volatile unsigned int  *)(base + ENET_INTERRUPT_CONFIGURATION_offset);
    *p = val; /* i/o write */
}



#ifdef __cplusplus
}
#endif

#endif /* _ENET_APP_H */

