/* ** 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_reg.c 修改记录: 202105222048: rxh, initial version 202105241522:rxh, 增加Detector接口 */ #include "stdlib.h" #include "stdio.h" #include "string.h" #include "object.h" #include "dlist.h" #include "bignumber.h" #include "hdl4secell.h" /* HDL4SE_REG instance parameter: "8", width=8 */ typedef struct _sHDL4SEReg { OBJECT_HEADER INTERFACE_DECLARE(IHDL4SEUnit) HDL4SEUNIT_VARDECLARE INTERFACE_DECLARE(IHDL4SEDetector) HDL4SEDETECTOR_VARDECLARE DLIST_VARDECLARE IHDL4SEModule** parent; char* name; IHDL4SEUnit** wire_in; int wire_in_index; IBigNumber** in_data; IBigNumber** out_data; int width; }sHDL4SEReg; OBJECT_FUNCDECLARE(hdl4se_reg, CLSID_HDL4SE_REG); HDL4SEUNIT_FUNCDECLARE(hdl4se_reg, CLSID_HDL4SE_REG, sHDL4SEReg); HDL4SEDETECTOR_FUNCDECLARE(hdl4se_reg, CLSID_HDL4SE_REG, sHDL4SEReg); DLIST_FUNCIMPL(hdl4se_reg, CLSID_HDL4SE_REG, sHDL4SEReg); OBJECT_FUNCIMPL(hdl4se_reg, sHDL4SEReg, CLSID_HDL4SE_REG); QUERYINTERFACE_BEGIN(hdl4se_reg, CLSID_HDL4SE_REG) QUERYINTERFACE_ITEM(IID_HDL4SEUNIT, IHDL4SEUnit, sHDL4SEReg) QUERYINTERFACE_ITEM(IID_HDL4SEDETECTOR, IHDL4SEDetector, sHDL4SEReg) QUERYINTERFACE_ITEM(IID_DLIST, IDList, sHDL4SEReg) QUERYINTERFACE_END static const char* hdl4se_regModuleInfo() { return "1.0.0-20210522.2048 HDL4SE reg cell"; } static int hdl4se_regCreate(const PARAMITEM* pParams, int paramcount, HOBJECT* pObject) { sHDL4SEReg* pobj; int i; pobj = (sHDL4SEReg*)malloc(sizeof(sHDL4SEReg)); if (pobj == NULL) return -1; *pObject = 0; HDL4SEUNIT_VARINIT(pobj, CLSID_HDL4SE_REG); INTERFACE_INIT(IHDL4SEUnit, pobj, hdl4se_reg, hdl4se_unit); INTERFACE_INIT(IHDL4SEDetector, pobj, hdl4se_reg, hdl4se_detector); DLIST_VARINIT(pobj, hdl4se_reg); pobj->wire_in = NULL; pobj->wire_in_index = 0; pobj->out_data = NULL; pobj->in_data = NULL; pobj->name = NULL; pobj->width = 8; 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 == objectCall3(temp, AssignStr, (const char*)pParams[i].pvalue, &nstr, 0)) { objectCall1(temp, GetInt32, &pobj->width); } objectRelease(temp); } } } if (pobj->width <= 0) return EIID_INVALIDPARAM; pobj->out_data = bigintegerCreate(pobj->width); pobj->in_data = bigintegerCreate(pobj->width); /* 返回生成的对象 */ OBJECT_RETURN_GEN(hdl4se_reg, pobj, pObject, CLSID_HDL4SE_REG); return EIID_OK; } static void hdl4se_regDestroy(HOBJECT object) { sHDL4SEReg* pobj; pobj = (sHDL4SEReg*)objectThis(object); if (pobj->name != NULL) free(pobj->name); objectRelease(pobj->wire_in); objectRelease(pobj->out_data); objectRelease(pobj->in_data); memset(pobj, 0, sizeof(sHDL4SEReg)); free(pobj); } static int hdl4se_regValid(HOBJECT object) { sHDL4SEReg* pobj; pobj = (sHDL4SEReg*)objectThis(object); return 1; } static int hdl4se_reg_hdl4se_unit_Connect(HOBJECT object, int index, HOBJECT from, int fromindex) { sHDL4SEReg* pobj; IHDL4SEUnit** unit = NULL; pobj = (sHDL4SEReg*)objectThis(object); if (0 == objectQueryInterface(from, IID_HDL4SEUNIT, (void**)&unit)) { objectRelease(pobj->wire_in); pobj->wire_in = unit; pobj->wire_in_index = fromindex; return 0; } return -1; } static int hdl4se_reg_hdl4se_unit_GetValue(HOBJECT object, int index, int width, IBigNumber ** value) { sHDL4SEReg* pobj; pobj = (sHDL4SEReg*)objectThis(object); objectCall1(value, Assign, pobj->out_data); objectCall2(value, SetWidth, width, 1); return 0; } static int hdl4se_reg_hdl4se_unit_ClkTick(HOBJECT object) { sHDL4SEReg* pobj; pobj = (sHDL4SEReg*)objectThis(object); objectCall3(pobj->wire_in, GetValue, pobj->wire_in_index, pobj->width, pobj->in_data); return 0; } static int hdl4se_reg_hdl4se_unit_Setup(HOBJECT object) { sHDL4SEReg* pobj; pobj = (sHDL4SEReg*)objectThis(object); objectCall1(pobj->out_data, Assign, pobj->in_data); return 0; } static int hdl4se_reg_hdl4se_detector_GetName(HOBJECT object, const char** pname) { sHDL4SEReg* pobj; pobj = (sHDL4SEReg*)objectThis(object); *pname = pobj->name; return 0; } static int hdl4se_reg_hdl4se_detector_GetSignalCount(HOBJECT object) { sHDL4SEReg* pobj; pobj = (sHDL4SEReg*)objectThis(object); return 1; } static int hdl4se_reg_hdl4se_detector_GetSignalInfo(HOBJECT object, int index, const char** pname, int *width) { sHDL4SEReg* pobj; pobj = (sHDL4SEReg*)objectThis(object); *pname = "out"; *width = pobj->width; return 0; } static int hdl4se_reg_hdl4se_detector_GetSignalValue(HOBJECT object, int index, IBigNumber** value) { sHDL4SEReg* pobj; pobj = (sHDL4SEReg*)objectThis(object); return hdl4se_reg_hdl4se_unit_GetValue(object, 0, pobj->width, value); } static int hdl4se_reg_hdl4se_detector_GetUnitCount(HOBJECT object) { sHDL4SEReg* pobj; pobj = (sHDL4SEReg*)objectThis(object); return 0; } static int hdl4se_reg_hdl4se_detector_GetUnit(HOBJECT object, int index, HOBJECT* unit) { sHDL4SEReg* pobj; pobj = (sHDL4SEReg*)objectThis(object); return 0; }