OpenCores
URL https://opencores.org/ocsvn/riscv_vhdl/riscv_vhdl/trunk

Subversion Repositories riscv_vhdl

[/] [riscv_vhdl/] [trunk/] [debugger/] [src/] [common/] [iservice.h] - Rev 4

Compare with Previous | Blame | View Log

/*
 *  Copyright 2018 Sergey Khabarov, sergeykhbr@gmail.com
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
 
#ifndef __DEBUGGER_COMMON_ISERVICE_H__
#define __DEBUGGER_COMMON_ISERVICE_H__
 
#include <iface.h>
#include <attribute.h>
#include <api_utils.h>
#include "coreservices/imemop.h"
 
namespace debugger {
 
static const char *const IFACE_SERVICE = "IService";
 
class IService : public IFace {
 public:
    explicit IService(const char *obj_name) : IFace(IFACE_SERVICE) {
        listInterfaces_ = AttributeType(Attr_List);
        listAttributes_ = AttributeType(Attr_List);
        listPorts_ = AttributeType(Attr_List);
        registerInterface(static_cast<IService *>(this));
        registerAttribute("LogLevel", &logLevel_);
        obj_name_.make_string(obj_name);
        logLevel_.make_int64(LOG_ERROR);
    }
    virtual ~IService() {
        // @warning: NEED to unregister attribute from class destructor
        /*for (unsigned i = 0; i < listAttributes_.size(); i++) {
            IAttribute *iattr = static_cast<IAttribute *>(
                                    listAttributes_[i].to_iface());
            iattr->freeAttrName();
            iattr->freeAttrDescription();
        }*/
    }
 
    virtual void initService(const AttributeType *args) {
        if (!args || !args->is_list()) {
            return;
        }
        AttributeType *cur_attr;
        for (unsigned i = 0; i < args->size(); i++) {
            const AttributeType &item = (*args)[i];
            if (item.size() < 2 || !item[0u].is_string()) {
                continue;
            }
            cur_attr = static_cast<AttributeType *>(
                                getAttribute(item[0u].to_string()));
            if (cur_attr == NULL) {
                RISCV_error("Attribute '%s' not found", item[0u].to_string());
                continue;
            }
            (*cur_attr) = item[1];
            if (item.size() >= 3 && item[2].is_string()) {
                static_cast<IAttribute *>(cur_attr)->allocAttrDescription(
                    item[2].to_string());
            }
        }
    }
 
    virtual void postinitService() {}
    virtual void predeleteService() {}
 
    virtual void registerInterface(IFace *iface) {
        AttributeType item(iface);
        listInterfaces_.add_to_list(&item);
        if (strcmp(iface->getFaceName(), IFACE_MEMORY_OPERATION) == 0) {
            IMemoryOperation *imemop = static_cast<IMemoryOperation *>(iface);
            registerAttribute("MapList", &imemop->listMap_);
            registerAttribute("BaseAddress", &imemop->baseAddress_);
            registerAttribute("Length", &imemop->length_);
            registerAttribute("Priority", &imemop->priority_);
        }
    }
    virtual void registerPortInterface(const char *portname, IFace *iface) {
        AttributeType item;
        item.make_list(2);
        item[0u].make_string(portname);
        item[1].make_iface(iface);
        listPorts_.add_to_list(&item);
    }
 
    virtual void unregisterInterface(IFace *iface) {
        for (unsigned i = 0; i < listInterfaces_.size(); i++) {
            if (listInterfaces_[i].to_iface() == iface) {
                listInterfaces_.remove_from_list(i);
                break;
            }
        }
    }
 
    virtual IFace *getInterface(const char *name) {
        IFace *tmp;
        for (unsigned i = 0; i < listInterfaces_.size(); i++) {
            tmp = listInterfaces_[i].to_iface();
            if (strcmp(name, tmp->getFaceName()) == 0) {
                return tmp;
            }
        }
        return NULL;
    }
 
    virtual IFace *getPortInterface(const char *portname,
                                    const char *facename) {
        IFace *tmp;
        for (unsigned i = 0; i < listPorts_.size(); i++) {
            AttributeType &item = listPorts_[i];
            if (!item[0u].is_equal(portname)) {
                continue;
            }
            tmp = item[1].to_iface();
            if (strcmp(facename, tmp->getFaceName()) == 0) {
                return tmp;
            }
        }
        return NULL;
    }
 
    virtual void registerAttribute(const char *name, IAttribute *iface) {
        AttributeType item(iface);
        iface->allocAttrName(name);
        listAttributes_.add_to_list(&item);
    }
 
    virtual IAttribute *getAttribute(const char *name) {
        IAttribute *tmp;
        for (unsigned i = 0; i < listAttributes_.size(); i++) {
            tmp = static_cast<IAttribute *>(listAttributes_[i].to_iface());
            if (strcmp(name, tmp->getAttrName()) == 0) {
                return tmp;
            }
        }
        return NULL;
    }
 
    virtual const char *getObjName() { return obj_name_.to_string(); }
 
    virtual AttributeType getConfiguration() {
        AttributeType ret(Attr_Dict);
        ret["Name"] = AttributeType(getObjName());
        ret["Attr"] = AttributeType(Attr_List);
 
        IAttribute *tmp = NULL;
        for (unsigned i = 0; i < listAttributes_.size(); i++) {
            tmp = static_cast<IAttribute *>(listAttributes_[i].to_iface());
            AttributeType item;
            item.make_list(2);
            item[0u].make_string(tmp->getAttrName());
            item[1] = *static_cast<AttributeType *>(tmp);
            ret["Attr"].add_to_list(&item);
        }
        return ret;
    }
 
 protected:
    AttributeType listInterfaces_;
    AttributeType listPorts_;       // [['portname',iface],*]
    AttributeType listAttributes_;
    AttributeType logLevel_;
    AttributeType obj_name_;
};
 
}  // namespace debugger
 
#endif  // __DEBUGGER_COMMON_ISERVICE_H__
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.