File size: 3,156 Bytes
134b4c4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/**************************************************************************************************
 *
 * Copyright (c) 2019-2024 Axera Semiconductor Co., Ltd. All Rights Reserved.
 *
 * This source file is the property of Axera Semiconductor Co., Ltd. and
 * may not be copied or distributed in any isomorphic form without the prior
 * written consent of Axera Semiconductor Co., Ltd.
 *
 **************************************************************************************************/

#include "middleware/runner.hpp"

#include "utilities/file.hpp"
#include "utilities/log.hpp"

#include <chrono>
#include <thread>

void middleware::runner::sleep_for(const uint32_t sleep_duration) const {
    std::this_thread::sleep_for(std::chrono::milliseconds(sleep_duration));
}

std::vector<std::string> middleware::runner::read(const std::string& list_file) {
    if (!utilities::exists(list_file) || !utilities::is_regular_file(list_file)) {
        utilities::glog.print(utilities::log::type::error,
            "Stimulus list file{%s} is not exist.\n", list_file.c_str());
        return {};
    }

    std::vector<std::string> list;

    std::ifstream list_stream;
    list_stream.open(list_file, std::ios::in);
    if (!list_stream.is_open()) {
        utilities::glog.print(utilities::log::type::error,
            "Read stimulus list file{%s} failed.\n", list_file.c_str());
        return {};
    }

    std::string file_path;
    while (std::getline(list_stream, file_path)) {
        list.push_back(file_path);
    }
    list_stream.close();

    return list;
}

bool middleware::runner::read(const std::string& binary_file, void* address, const uintmax_t& size) {
    if (!utilities::exists(binary_file) || !utilities::is_regular_file(binary_file)) {
        utilities::glog.print(utilities::log::type::error,
            "Stimulus file{%s} is not exist.\n", binary_file.c_str());
        return false;
    }

    const auto file_size = utilities::file_size(binary_file);
    if (utilities::error_size == file_size) {
        utilities::glog.print(utilities::log::type::error, "Get stimulus file size failed.\n");
        return false;
    }

    if (file_size != size) {
        utilities::glog.print(utilities::log::type::error,
            "Size of stimulus file{%s} is not equal the specified{file: %d vs tensor: %d}.\n", binary_file.c_str(), file_size, size);
        return false;
    }

    return utilities::read(binary_file, address, size);
}

bool middleware::runner::write(const std::string& binary_file, const void* address, const uintmax_t& size) {
    return utilities::write(binary_file, address, size);
}

bool middleware::runner::verify(const void* dst, const void* src, const uintmax_t& size) {
    const auto* src_ptr = static_cast<const uint8_t*>(src);
    const auto* dst_ptr = static_cast<const uint8_t*>(dst);

    for (uintmax_t i = 0; i < size; i++) {
        if (src_ptr[i] != dst_ptr[i]) {
            utilities::glog.print(utilities::log::type::error,
                "Verify stimulus failed{offset: 0x%x; 0x%02X vs. 0x%02X}.\n", i, src_ptr[i], dst_ptr[i]);
            return false;
        }
    }

    return true;
}