/*
** HDL4SE: 软件Verilog综合仿真平台
** Copyright (C) 2021-2021, raoxianhong<raoxianhong@163.net>
** LCOM: 轻量级组件对象模型
** Copyright (C) 2021-2021, raoxianhong<raoxianhong@163.net>
** All rights reserved.
**
** Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are met:
**
** * Redistributions of source code must retain the above copyright notice,
**   this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright notice,
**   this list of conditions and the following disclaimer in the documentation
**   and/or other materials provided with the distribution.
** * The name of the author may be used to endorse or promote products
**   derived from this software without specific prior written permission.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
** THE POSSIBILITY OF SUCH DAMAGE.
*/

/*
* hdl4sesim.h
  修改记录：
    202105180851: rxh, initial version
    202105241001: rxh, 删除了AddDevice中的baseaddr，
                       设备是否选通由自己说了算。
*/
#ifndef __HDL4SESIM_H
#define __HDL4SESIM_H

#ifdef __cplusplus
extern "C" {
#endif

#ifndef _ASMLANGUAGE

#include "guid.h"

DEFINE_GUID(IID_HDL4SESIMULATOR, 0xf2fd8eba, 0x3376, 0x41af, 0xbe, 0x81, 0x13, 0xb9, 0xad, 0xef, 0x90, 0x86);

typedef struct sIHDL4SESimulator {
    OBJECT_INTERFACE
    int (*SetTopModule)(HOBJECT object, IHDL4SEUnit** topmodule);
    int (*AddDevice)(HOBJECT object, IHDL4SEUnit** device);
    int (*SetReset)(HOBJECT object, int reset);
    int (*RunClockTick)(HOBJECT object);
}IHDL4SESimulator;

#define HDL4SESIMULATOR_VARDECLARE
#define HDL4SESIMULATOR_VARINIT(_objptr, _sid)

#define HDL4SESIMULATOR_FUNCDECLARE(_obj, _clsid, _localstruct) \
    static int _obj##_hdl4se_simulator_SetTopModule(HOBJECT object, IHDL4SEUnit ** topmodule); \
    static int _obj##_hdl4se_simulator_AddDevice(HOBJECT object, IHDL4SEUnit** device); \
    static int _obj##_hdl4se_simulator_SetReset(HOBJECT object, int reset); \
    static int _obj##_hdl4se_simulator_RunClockTick(HOBJECT object); \
    static const IHDL4SESimulator _obj##_hdl4se_simulator_interface = { \
   	INTERFACE_HEADER(_obj, IHDL4SESimulator, _localstruct) \
        _obj##_hdl4se_simulator_SetTopModule, \
        _obj##_hdl4se_simulator_AddDevice, \
        _obj##_hdl4se_simulator_SetReset, \
        _obj##_hdl4se_simulator_RunClockTick, \
    };


DEFINE_GUID(CLSID_HDL4SESIMULATOR, 0xb97697f, 0xc59d, 0x4e15, 0x95, 0x46, 0xad, 0x17, 0x99, 0xd4, 0xb6, 0x1d);

IHDL4SESimulator** hdl4sesimCreateSimulator();

#endif

#ifdef __cplusplus
}
#endif

#endif