/* ** 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_bind3.c 修改记录: 202105230618: 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_BIND3 instance parameter: "8, 9, 10", inputwidth0=8, inputwidth1=9, inputwidth2=10 outputwidth=8+9+10 */ #define BINDCOUNT 3 typedef struct _sHDL4SEBind3 { OBJECT_HEADER INTERFACE_DECLARE(IHDL4SEUnit) HDL4SEUNIT_VARDECLARE INTERFACE_DECLARE(IHDL4SEDetector) HDL4SEDETECTOR_VARDECLARE DLIST_VARDECLARE IHDL4SEModule** parent; char* name; int inputwidth[BINDCOUNT]; IHDL4SEUnit** in[BINDCOUNT]; int in_index[BINDCOUNT]; IBigNumber** in_data[BINDCOUNT]; IBigNumber** out_data; int out_width; int datavalid; }sHDL4SEBind3; OBJECT_FUNCDECLARE(hdl4se_bind3, CLSID_HDL4SE_BIND3); HDL4SEUNIT_FUNCDECLARE(hdl4se_bind3, CLSID_HDL4SE_BIND3, sHDL4SEBind3); HDL4SEDETECTOR_FUNCDECLARE(hdl4se_bind3, CLSID_HDL4SE_BIND3, sHDL4SEBind3); DLIST_FUNCIMPL(hdl4se_bind3, CLSID_HDL4SE_BIND3, sHDL4SEBind3); OBJECT_FUNCIMPL(hdl4se_bind3, sHDL4SEBind3, CLSID_HDL4SE_BIND3); QUERYINTERFACE_BEGIN(hdl4se_bind3, CLSID_HDL4SE_BIND3) QUERYINTERFACE_ITEM(IID_HDL4SEUNIT, IHDL4SEUnit, sHDL4SEBind3) QUERYINTERFACE_ITEM(IID_HDL4SEDETECTOR, IHDL4SEDetector, sHDL4SEBind3) QUERYINTERFACE_ITEM(IID_DLIST, IDList, sHDL4SEBind3) QUERYINTERFACE_END static const char* hdl4se_bind3ModuleInfo() { return "1.0.0-20210523.0618 HDL4SE Bind3 cell"; } static int hdl4se_bind3Create(const PARAMITEM* pParams, int paramcount, HOBJECT* pObject) { sHDL4SEBind3* pobj; int i; pobj = (sHDL4SEBind3*)malloc(sizeof(sHDL4SEBind3)); if (pobj == NULL) return -1; *pObject = 0; HDL4SEUNIT_VARINIT(pobj, CLSID_HDL4SE_BIND3); INTERFACE_INIT(IHDL4SEUnit, pobj, hdl4se_bind3, hdl4se_unit); INTERFACE_INIT(IHDL4SEDetector, pobj, hdl4se_bind3, hdl4se_detector); DLIST_VARINIT(pobj, hdl4se_bind3); for (i = 0; i < BINDCOUNT; i++) { pobj->in[i] = NULL; pobj->in_index[i] = 0; pobj->inputwidth[i] = 8; pobj->in_data[i] = NULL; } pobj->out_data = NULL; pobj->datavalid = 0; pobj->name = NULL; 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; const char* lstr; int j; lstr = (const char*)pParams[i].pvalue; for (j = 0; j < BINDCOUNT; j++) { if (0 == objectCall3(temp, AssignStr, lstr, &nstr, 0)) { objectCall1(temp, GetInt32, &pobj->inputwidth[j]); lstr = nstr; } } objectRelease(temp); } } } pobj->out_width = 0; for (i = 0; i < BINDCOUNT; i++) { if (pobj->inputwidth[i] <= 0) return EIID_INVALIDPARAM; pobj->in_data[i] = bigintegerCreate(pobj->inputwidth[i]); pobj->out_width += pobj->inputwidth[i]; } pobj->out_data = bigintegerCreate(pobj->out_width); /* 返回生成的对象 */ OBJECT_RETURN_GEN(hdl4se_bind3, pobj, pObject, CLSID_HDL4SE_BIND3); return EIID_OK; } static void hdl4se_bind3Destroy(HOBJECT object) { sHDL4SEBind3* pobj; int i; pobj = (sHDL4SEBind3*)objectThis(object); if (pobj->name != NULL) free(pobj->name); for (i = 0; i < BINDCOUNT; i++) { objectRelease(pobj->in[i]); objectRelease(pobj->in_data[i]); } objectRelease(pobj->out_data); memset(pobj, 0, sizeof(sHDL4SEBind3)); free(pobj); } static int hdl4se_bind3Valid(HOBJECT object) { sHDL4SEBind3* pobj; pobj = (sHDL4SEBind3*)objectThis(object); return 1; } static int hdl4se_bind3_hdl4se_unit_Connect(HOBJECT object, int index, HOBJECT from, int fromindex) { sHDL4SEBind3* pobj; IHDL4SEUnit** unit = NULL; pobj = (sHDL4SEBind3*)objectThis(object); if (index >= 0 && index < BINDCOUNT) { if (0 == objectQueryInterface(from, IID_HDL4SEUNIT, (void**)&unit)) { objectRelease(pobj->in[index]); pobj->in[index] = unit; pobj->in_index[index] = fromindex; } else { return -2; } } else { return -1; } return 0; } static int hdl4se_bind3_hdl4se_unit_GetValue(HOBJECT object, int index, int width, IBigNumber ** value) { int i; sHDL4SEBind3* pobj; pobj = (sHDL4SEBind3*)objectThis(object); if (pobj->datavalid == 0) { for (i = 0; i < BINDCOUNT; i++) { objectCall3(pobj->in[i], GetValue, pobj->in_index[i], pobj->inputwidth[i], pobj->in_data[i]); } for (i = BINDCOUNT - 1; i >= 0; i--) { objectCall2(pobj->out_data, SHL, pobj->out_data, pobj->inputwidth[i]); objectCall2(pobj->out_data, Or, pobj->out_data, pobj->in_data[i]); } pobj->datavalid = 1; } objectCall1(value, Assign, pobj->out_data); return 0; } static int hdl4se_bind3_hdl4se_unit_ClkTick(HOBJECT object) { sHDL4SEBind3* pobj; pobj = (sHDL4SEBind3*)objectThis(object); return 0; } static int hdl4se_bind3_hdl4se_unit_Setup(HOBJECT object) { sHDL4SEBind3* pobj; pobj = (sHDL4SEBind3*)objectThis(object); pobj->datavalid = 0; return 0; } static int hdl4se_bind3_hdl4se_detector_GetName(HOBJECT object, const char** pname) { sHDL4SEBind3* pobj; pobj = (sHDL4SEBind3*)objectThis(object); *pname = pobj->name; return 0; } static int hdl4se_bind3_hdl4se_detector_GetSignalCount(HOBJECT object) { sHDL4SEBind3* pobj; pobj = (sHDL4SEBind3*)objectThis(object); return 1; } static int hdl4se_bind3_hdl4se_detector_GetSignalInfo(HOBJECT object, int index, const char** pname, int *width) { sHDL4SEBind3* pobj; pobj = (sHDL4SEBind3*)objectThis(object); *pname = "out"; *width = pobj->out_width; return 0; } static int hdl4se_bind3_hdl4se_detector_GetSignalValue(HOBJECT object, int index, IBigNumber** value) { sHDL4SEBind3* pobj; pobj = (sHDL4SEBind3*)objectThis(object); return hdl4se_bind3_hdl4se_unit_GetValue(object, 0, pobj->out_width, value); } static int hdl4se_bind3_hdl4se_detector_GetUnitCount(HOBJECT object) { sHDL4SEBind3* pobj; pobj = (sHDL4SEBind3*)objectThis(object); return 0; } static int hdl4se_bind3_hdl4se_detector_GetUnit(HOBJECT object, int index, HOBJECT* unit) { sHDL4SEBind3* pobj; pobj = (sHDL4SEBind3*)objectThis(object); return 0; }