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

Subversion Repositories riscv_vhdl

[/] [riscv_vhdl/] [trunk/] [debugger/] [src/] [common/] [generic/] [mapreg.cpp] - Blame information for rev 5

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 5 sergeykhbr
/*
2
 *  Copyright 2018 Sergey Khabarov, sergeykhbr@gmail.com
3
 *
4
 *  Licensed under the Apache License, Version 2.0 (the "License");
5
 *  you may not use this file except in compliance with the License.
6
 *  You may obtain a copy of the License at
7
 *
8
 *      http://www.apache.org/licenses/LICENSE-2.0
9
 *
10
 *  Unless required by applicable law or agreed to in writing, software
11
 *  distributed under the License is distributed on an "AS IS" BASIS,
12
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
 *  See the License for the specific language governing permissions and
14
 *  limitations under the License.
15
 */
16
 
17
#include <api_core.h>
18
#include "mapreg.h"
19
 
20
namespace debugger {
21
 
22
MappedReg64Type::MappedReg64Type(IService *parent, const char *name,
23
                  uint64_t addr, int len, int priority) {
24
    if (parent == NULL) {
25
    } else {
26
        parent->registerPortInterface(name,
27
                static_cast<IMemoryOperation *>(this));
28
        parent->registerPortInterface(name,
29
                static_cast<IResetListener *>(this));
30
    }
31
    parent_ = parent;
32
    portListeners_.make_list(0);
33
    regname_.make_string(name);
34
    baseAddress_.make_uint64(addr);
35
    length_.make_uint64(len);
36
    priority_.make_int64(priority);
37
    value_.val = 0;
38
    hard_reset_value_ = 0;
39
}
40
 
41
IFace *MappedReg64Type::getInterface(const char *name) {
42
    if (strcmp(name, IFACE_MEMORY_OPERATION) == 0) {
43
        return static_cast<IMemoryOperation *>(this);
44
    }
45
    return parent_->getInterface(name);
46
}
47
 
48
void MappedReg64Type::reset(bool active) {
49
    if (!active) {
50
        return;
51
    }
52
    value_.val = hard_reset_value_;
53
}
54
 
55
ETransStatus MappedReg64Type::b_transport(Axi4TransactionType *trans) {
56
    uint64_t off = trans->addr - getBaseAddress();
57
    if (trans->action == MemAction_Read) {
58
        Reg64Type cur;
59
        cur.val = aboutToRead(value_.val);
60
        memcpy(trans->rpayload.b8, &cur.buf[off], trans->xsize);
61
        RISCV_debug("Read %s [%02" RV_PRI64 "x] => %016" RV_PRI64 "x",
62
                    regName(), trans->addr, trans->rpayload.b64[0]);
63
    } else {
64
        Reg64Type new_val = value_;
65
        memcpy(&new_val.buf[off], trans->wpayload.b8, trans->xsize);
66
        new_val.val = aboutToWrite(new_val.val);
67
        value_ = new_val;
68
        RISCV_debug("Write %s [%02" RV_PRI64 "x] <= %016" RV_PRI64 "x",
69
                    regName(), trans->addr, trans->wpayload.b64[0]);
70
    }
71
    return TRANS_OK;
72
}
73
 
74
ETransStatus GenericReg64Bank::b_transport(Axi4TransactionType *trans) {
75
    int idx = static_cast<int>((trans->addr - getBaseAddress()) >> 3);
76
    if (trans->action == MemAction_Read) {
77
        trans->rpayload.b64[0] = read(idx).val;
78
    } else {
79
        write(idx, trans->wpayload.b64[0]);
80
    }
81
    return TRANS_OK;
82
}
83
 
84
void GenericReg64Bank::reset() {
85
    memset(regs_, 0, length_.to_int());
86
}
87
 
88
void GenericReg64Bank::setRegTotal(int len) {
89
    if (len * static_cast<int>(sizeof(Reg64Type)) == length_.to_int()) {
90
        return;
91
    }
92
    if (regs_) {
93
        delete [] regs_;
94
    }
95
    length_.make_int64(len * sizeof(Reg64Type));
96
    regs_ = new Reg64Type[len];
97
    reset();
98
}
99
 
100
}  // namespace debugger
101
 

powered by: WebSVN 2.1.0

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