/* ** HDL4SE: 软件Verilog综合仿真平台 ** Copyright (C) 2021-2021, raoxianhong ** LCOM: 轻量级组件对象模型 ** Copyright (C) 2021-2021, raoxianhong ** 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. */ /* * hdl4se_const.c 修改记录: 202105221944: rxh, initial version 202105241522:rxh, 增加Detector接口 */ #include "stdlib.h" #include "stdio.h" #include "object.h" #include "dlist.h" #include "bignumber.h" #include "hdl4secell.h" /* HDL4SE_CONST instance parameter: "8, value", width=8 */ typedef struct _sHDL4SEConst { OBJECT_HEADER INTERFACE_DECLARE(IHDL4SEUnit) INTERFACE_DECLARE(IHDL4SEDetector) HDL4SEUNIT_VARDECLARE HDL4SEDETECTOR_VARDECLARE DLIST_VARDECLARE char* name; IHDL4SEModule** parent; IBigNumber** out_data; int width; }sHDL4SEConst; OBJECT_FUNCDECLARE(hdl4se_const, CLSID_HDL4SE_CONST); HDL4SEUNIT_FUNCDECLARE(hdl4se_const, CLSID_HDL4SE_CONST, sHDL4SEConst); HDL4SEDETECTOR_FUNCDECLARE(hdl4se_const, CLSID_HDL4SE_CONST, sHDL4SEConst); DLIST_FUNCIMPL(hdl4se_const, CLSID_HDL4SE_CONST, sHDL4SEConst); OBJECT_FUNCIMPL(hdl4se_const, sHDL4SEConst, CLSID_HDL4SE_CONST); QUERYINTERFACE_BEGIN(hdl4se_const, CLSID_HDL4SE_CONST) QUERYINTERFACE_ITEM(IID_HDL4SEUNIT, IHDL4SEUnit, sHDL4SEConst) QUERYINTERFACE_ITEM(IID_HDL4SEDETECTOR, IHDL4SEDetector, sHDL4SEConst) QUERYINTERFACE_ITEM(IID_DLIST, IDList, sHDL4SEConst) QUERYINTERFACE_END static const char* hdl4se_constModuleInfo() { return "1.0.0-20210522.1944 HDL4SE Const cell"; } static int hdl4se_constCreate(const PARAMITEM* pParams, int paramcount, HOBJECT* pObject) { sHDL4SEConst* pobj; int i; pobj = (sHDL4SEConst*)malloc(sizeof(sHDL4SEConst)); if (pobj == NULL) return -1; *pObject = 0; HDL4SEUNIT_VARINIT(pobj, CLSID_HDL4SE_CONST); INTERFACE_INIT(IHDL4SEUnit, pobj, hdl4se_const, hdl4se_unit); INTERFACE_INIT(IHDL4SEDetector, pobj, hdl4se_const, hdl4se_detector); DLIST_VARINIT(pobj, hdl4se_const); pobj->out_data = NULL; pobj->name = NULL; pobj->width = 0; pobj->parent = NULL; for (i = 0; i < paramcount; i++) { if (pParams[i].name == PARAMID_HDL4SE_UNIT_NAME) { if (pobj->name != NULL) free(pobj->name); pobj->name = strdup(pParams[i].pvalue); } else if (pParams[i].name == PARAMID_HDL4SE_UNIT_PARENT) { pobj->parent = (IHDL4SEModule **)pParams[i].pvalue; } else if (pParams[i].name == PARAMID_HDL4SE_UNIT_INSTANCE_PARAMETERS) { IBigNumber** temp = bigintegerCreate(32); if (temp != NULL) { const char* nstr; if (0 == objectCall2(temp, AssignStr, (const char*)pParams[i].pvalue, &nstr)) { objectCall1(temp, GetInt, &pobj->width); } if (pobj->width <= 0 || pobj->width > (1 << 24)) return -1; pobj->out_data = bigintegerCreate(pobj->width); objectCall2(pobj->out_data, AssignStr, nstr, NULL); objectRelease(temp); } } } if (pobj->out_data == NULL) { return NULL; } /* 返回生成的对象 */ OBJECT_RETURN_GEN(hdl4se_const, pobj, pObject, CLSID_HDL4SE_CONST); return EIID_OK; } static void hdl4se_constDestroy(HOBJECT object) { sHDL4SEConst* pobj; int i; pobj = (sHDL4SEConst*)objectThis(object); if (pobj->name != NULL) free(pobj->name); objectRelease(pobj->out_data); memset(pobj, 0, sizeof(sHDL4SEConst)); free(pobj); } static int hdl4se_constValid(HOBJECT object) { sHDL4SEConst* pobj; pobj = (sHDL4SEConst*)objectThis(object); return 1; } static int hdl4se_const_hdl4se_unit_Connect(HOBJECT object, int index, HOBJECT from, int fromindex) { return 0; } static int hdl4se_const_hdl4se_unit_GetValue(HOBJECT object, int index, int width, IBigNumber ** value) { sHDL4SEConst* pobj; pobj = (sHDL4SEConst*)objectThis(object); objectCall1(value, Assign, pobj->out_data); return 0; } static int hdl4se_const_hdl4se_unit_ClkTick(HOBJECT object) { return 0; } static int hdl4se_const_hdl4se_unit_Setup(HOBJECT object) { return 0; } static int hdl4se_const_hdl4se_detector_GetName(HOBJECT object, const char** pname) { sHDL4SEConst* pobj; pobj = (sHDL4SEConst*)objectThis(object); *pname = pobj->name; return 0; } static int hdl4se_const_hdl4se_detector_GetSignalCount(HOBJECT object) { sHDL4SEConst* pobj; pobj = (sHDL4SEConst*)objectThis(object); return 1; } static int hdl4se_const_hdl4se_detector_GetSignalInfo(HOBJECT object, int index, const char** pname, int * width) { sHDL4SEConst* pobj; pobj = (sHDL4SEConst*)objectThis(object); *pname = "out"; *width = pobj->width; return 0; } static int hdl4se_const_hdl4se_detector_GetSignalValue(HOBJECT object, int index, IBigNumber** value) { sHDL4SEConst* pobj; pobj = (sHDL4SEConst*)objectThis(object); objectCall1(value, Assign, pobj->out_data); return 0; } static int hdl4se_const_hdl4se_detector_GetUnitCount(HOBJECT object) { sHDL4SEConst* pobj; pobj = (sHDL4SEConst*)objectThis(object); return 0; } static int hdl4se_const_hdl4se_detector_GetUnit(HOBJECT object, int index, HOBJECT* unit) { sHDL4SEConst* pobj; pobj = (sHDL4SEConst*)objectThis(object); return 0; }