nkeynes@1104: /** nkeynes@1104: * $Id$ nkeynes@1104: * nkeynes@1104: * mmio register code generator nkeynes@1104: * nkeynes@1104: * Copyright (c) 2010 Nathan Keynes. nkeynes@1104: * nkeynes@1104: * This program is free software; you can redistribute it and/or modify nkeynes@1104: * it under the terms of the GNU General Public License as published by nkeynes@1104: * the Free Software Foundation; either version 2 of the License, or nkeynes@1104: * (at your option) any later version. nkeynes@1104: * nkeynes@1104: * This program is distributed in the hope that it will be useful, nkeynes@1104: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@1104: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@1104: * GNU General Public License for more details. nkeynes@1104: */ nkeynes@1104: nkeynes@1104: #ifndef lxdream_genmmio_H nkeynes@1104: #define lxdream_genmmio_H 1 nkeynes@1104: nkeynes@1104: #include nkeynes@1104: #include nkeynes@1104: nkeynes@1104: #ifdef __cplusplus nkeynes@1104: extern "C" { nkeynes@1104: #endif nkeynes@1104: nkeynes@1104: typedef enum { nkeynes@1104: REG_CONST, nkeynes@1104: REG_RW, nkeynes@1104: REG_RO, nkeynes@1104: REG_WO, nkeynes@1104: REG_MIRROR, /* Additional address for an existing register - value is the offset of the target reg */ nkeynes@1104: } register_mode_t; nkeynes@1104: nkeynes@1104: typedef enum { nkeynes@1104: REG_I8, nkeynes@1104: REG_I16, nkeynes@1104: REG_I32, nkeynes@1104: REG_I64, nkeynes@1104: REG_F32, nkeynes@1104: REG_F64, nkeynes@1104: REG_STRING, nkeynes@1104: } register_type_t; nkeynes@1104: nkeynes@1104: typedef enum { nkeynes@1104: ENDIAN_DEFAULT, nkeynes@1104: ENDIAN_LITTLE, nkeynes@1104: ENDIAN_BIG nkeynes@1104: } register_endian_t; nkeynes@1104: nkeynes@1104: typedef enum { nkeynes@1104: ACCESS_DEFAULT, nkeynes@1104: ACCESS_ANY, nkeynes@1104: ACCESS_NOOFFSET, nkeynes@1104: ACCESS_EXACT nkeynes@1104: } register_access_t; nkeynes@1104: nkeynes@1104: typedef enum { nkeynes@1104: TRACE_DEFAULT, nkeynes@1104: TRACE_NEVER, nkeynes@1104: TRACE_ALWAYS nkeynes@1104: } register_trace_t; nkeynes@1104: nkeynes@1104: typedef enum { nkeynes@1104: TEST_DEFAULT, nkeynes@1104: TEST_OFF, nkeynes@1104: TEST_ON nkeynes@1104: } register_test_t; nkeynes@1104: nkeynes@1104: union apval { nkeynes@1104: uint64_t i; nkeynes@1104: char a[8]; nkeynes@1104: const char *s; nkeynes@1104: }; nkeynes@1104: nkeynes@1104: struct action { nkeynes@1104: const char *filename; nkeynes@1104: int lineno; nkeynes@1104: const char *text; nkeynes@1104: }; nkeynes@1104: nkeynes@1104: typedef struct regflags { nkeynes@1104: register_endian_t endian; nkeynes@1104: register_access_t access; nkeynes@1104: register_trace_t traceFlag; nkeynes@1104: register_test_t testFlag; nkeynes@1104: union apval maskValue; nkeynes@1104: unsigned int fillSizeBytes; nkeynes@1104: union apval fillValue; nkeynes@1104: } *regflags_t; nkeynes@1104: nkeynes@1104: typedef struct regdef { nkeynes@1104: const char *name; nkeynes@1104: const char *description; nkeynes@1104: uint32_t offset; nkeynes@1104: unsigned numBytes; nkeynes@1104: unsigned numElements; nkeynes@1104: unsigned stride; nkeynes@1104: register_mode_t mode; nkeynes@1104: register_type_t type; nkeynes@1104: gboolean initUndefined; nkeynes@1104: union apval initValue; nkeynes@1104: struct regflags flags; nkeynes@1104: struct action *action; nkeynes@1104: } *regdef_t; nkeynes@1104: nkeynes@1104: typedef struct regblock { nkeynes@1104: const char *name; nkeynes@1104: const char *description; nkeynes@1104: uint32_t address; nkeynes@1104: struct regflags flags; nkeynes@1104: unsigned numRegs; nkeynes@1104: unsigned blockSize; nkeynes@1104: regdef_t regs[]; nkeynes@1104: } *regblock_t; nkeynes@1104: nkeynes@1104: nkeynes@1104: nkeynes@1104: GList *ioparse( const char *filename, GList *list ); nkeynes@1104: nkeynes@1104: #ifdef __cplusplus nkeynes@1104: } nkeynes@1104: #endif nkeynes@1104: nkeynes@1104: #endif /* !lxdream_genmmio_H */