/********************************************************************************
 * Marvell GPL License Option
 *
 * If you received this File from Marvell, you may opt to use, redistribute and/or
 * modify this File in accordance with the terms and conditions of the General
 * Public License Version 2, June 1991 (the "GPL License"), a copy of which is
 * available along with the File in the license.txt file or by writing to the Free
 * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or
 * on the worldwide web at http://www.gnu.org/licenses/gpl.txt.
 *
 * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY
 * DISCLAIMED.  The GPL License provides additional details about this warranty
 * disclaimer.
 ******************************************************************************/

//////
/// don't edit! auto-generated by docc: J2A.h
////////////////////////////////////////////////////////////
#ifndef J2A_h
#define J2A_h (){}


#include "ctypes.h"

#pragma pack(1)
#ifdef __cplusplus
  extern "C" {
#endif

#ifndef _DOCC_H_BITOPS_
#define _DOCC_H_BITOPS_ (){}

    #define _bSETMASK_(b)                                      ((b)<32 ? (1<<((b)&31)) : 0)
    #define _NSETMASK_(msb,lsb)                                (_bSETMASK_((msb)+1)-_bSETMASK_(lsb))
    #define _bCLRMASK_(b)                                      (~_bSETMASK_(b))
    #define _NCLRMASK_(msb,lsb)                                (~_NSETMASK_(msb,lsb))
    #define _BFGET_(r,msb,lsb)                                 (_NSETMASK_((msb)-(lsb),0)&((r)>>(lsb)))
    #define _BFSET_(r,msb,lsb,v)                               do{ (r)&=_NCLRMASK_(msb,lsb); (r)|=_NSETMASK_(msb,lsb)&((v)<<(lsb)); }while(0)

#endif



//////
/// 
/// $INTERFACE AHB_DATA                biu              (4,4)
///     ###
///     * format definition for the AHB_DATA register
///     * [00:31]
///     ###
///     # # ----------------------------------------------------------
///     @ 0x00000 data                 (P)
///               %unsigned 32 val                       
///                                    ###
///                                    * content of the read/write data registers
///                                    * [32:63]
///                                    ###
///     @ 0x00004 flag                 (P)
///               %unsigned 1  rd                        
///                                    ###
///                                    * outgoing: read data is valid or not;
///                                    * incoming: a new AHB read should be triggered
///                                    ###
///               %unsigned 1  wr                        
///                                    ###
///                                    * outgoing: 0
///                                    * incoming: a new AHB write should be triggered
///                                    ###
///               %%        30         # Stuffing bits...
///     # # ----------------------------------------------------------
/// $ENDOFINTERFACE  # size:       8B, bits:      34b, padding:     0B
////////////////////////////////////////////////////////////
#ifndef h_AHB_DATA
#define h_AHB_DATA (){}

    #define     RA_AHB_DATA_data                               0x0000

    #define     BA_AHB_DATA_data_val                           0x0000
    #define     B16AHB_DATA_data_val                           0x0000
    #define   LSb32AHB_DATA_data_val                              0
    #define   LSb16AHB_DATA_data_val                              0
    #define       bAHB_DATA_data_val                           32
    #define   MSK32AHB_DATA_data_val                              0xFFFFFFFF
    ///////////////////////////////////////////////////////////
    #define     RA_AHB_DATA_flag                               0x0004

    #define     BA_AHB_DATA_flag_rd                            0x0004
    #define     B16AHB_DATA_flag_rd                            0x0004
    #define   LSb32AHB_DATA_flag_rd                               0
    #define   LSb16AHB_DATA_flag_rd                               0
    #define       bAHB_DATA_flag_rd                            1
    #define   MSK32AHB_DATA_flag_rd                               0x00000001

    #define     BA_AHB_DATA_flag_wr                            0x0004
    #define     B16AHB_DATA_flag_wr                            0x0004
    #define   LSb32AHB_DATA_flag_wr                               1
    #define   LSb16AHB_DATA_flag_wr                               1
    #define       bAHB_DATA_flag_wr                            1
    #define   MSK32AHB_DATA_flag_wr                               0x00000002
    ///////////////////////////////////////////////////////////

    typedef struct SIE_AHB_DATA {
    ///////////////////////////////////////////////////////////
    #define   GET32AHB_DATA_data_val(r32)                      _BFGET_(r32,31, 0)
    #define   SET32AHB_DATA_data_val(r32,v)                    _BFSET_(r32,31, 0,v)

    #define     w32AHB_DATA_data                               {\
            UNSG32 udata_val                                   : 32;\
          }
    union { UNSG32 u32AHB_DATA_data;
            struct w32AHB_DATA_data;
          };
    ///////////////////////////////////////////////////////////
    #define   GET32AHB_DATA_flag_rd(r32)                       _BFGET_(r32, 0, 0)
    #define   SET32AHB_DATA_flag_rd(r32,v)                     _BFSET_(r32, 0, 0,v)
    #define   GET16AHB_DATA_flag_rd(r16)                       _BFGET_(r16, 0, 0)
    #define   SET16AHB_DATA_flag_rd(r16,v)                     _BFSET_(r16, 0, 0,v)

    #define   GET32AHB_DATA_flag_wr(r32)                       _BFGET_(r32, 1, 1)
    #define   SET32AHB_DATA_flag_wr(r32,v)                     _BFSET_(r32, 1, 1,v)
    #define   GET16AHB_DATA_flag_wr(r16)                       _BFGET_(r16, 1, 1)
    #define   SET16AHB_DATA_flag_wr(r16,v)                     _BFSET_(r16, 1, 1,v)

    #define     w32AHB_DATA_flag                               {\
            UNSG32 uflag_rd                                    :  1;\
            UNSG32 uflag_wr                                    :  1;\
            UNSG32 RSVDx4_b2                                   : 30;\
          }
    union { UNSG32 u32AHB_DATA_flag;
            struct w32AHB_DATA_flag;
          };
    ///////////////////////////////////////////////////////////
    } SIE_AHB_DATA;

    typedef union  T32AHB_DATA_data
          { UNSG32 u32;
            struct w32AHB_DATA_data;
                 } T32AHB_DATA_data;
    typedef union  T32AHB_DATA_flag
          { UNSG32 u32;
            struct w32AHB_DATA_flag;
                 } T32AHB_DATA_flag;
    ///////////////////////////////////////////////////////////

    typedef union  TAHB_DATA_data
          { UNSG32 u32[1];
            struct {
            struct w32AHB_DATA_data;
                   };
                 } TAHB_DATA_data;
    typedef union  TAHB_DATA_flag
          { UNSG32 u32[1];
            struct {
            struct w32AHB_DATA_flag;
                   };
                 } TAHB_DATA_flag;

    ///////////////////////////////////////////////////////////
     SIGN32 AHB_DATA_drvrd(SIE_AHB_DATA *p, UNSG32 base, SIGN32 mem, SIGN32 tst);
     SIGN32 AHB_DATA_drvwr(SIE_AHB_DATA *p, UNSG32 base, SIGN32 mem, SIGN32 tst, UNSG32 *pcmd);
       void AHB_DATA_reset(SIE_AHB_DATA *p);
     SIGN32 AHB_DATA_cmp  (SIE_AHB_DATA *p, SIE_AHB_DATA *pie, char *pfx, void *hLOG, SIGN32 mem, SIGN32 tst);
    #define AHB_DATA_check(p,pie,pfx,hLOG) AHB_DATA_cmp(p,pie,pfx,(void*)(hLOG),0,0)
    #define AHB_DATA_print(p,    pfx,hLOG) AHB_DATA_cmp(p,0,  pfx,(void*)(hLOG),0,0)

#endif
//////
/// ENDOFINTERFACE: AHB_DATA
////////////////////////////////////////////////////////////



#ifdef __cplusplus
  }
#endif
#pragma  pack()

#endif
//////
/// ENDOFFILE: J2A.h
////////////////////////////////////////////////////////////

