Skip to content

Commit

Permalink
added a write_range and a reset APIs for register arrays; reset made …
Browse files Browse the repository at this point in the history
…it to the CLI
  • Loading branch information
antoninbas committed Apr 7, 2016
1 parent 9637233 commit 483373e
Show file tree
Hide file tree
Showing 7 changed files with 107 additions and 4 deletions.
31 changes: 27 additions & 4 deletions modules/bm_runtime/src/Standard_server.ipp
Original file line number Diff line number Diff line change
Expand Up @@ -570,11 +570,11 @@ public:
}
}

BmRegisterValue bm_register_read(const int32_t cxt_id, const std::string& register_name, const int32_t index) {
BmRegisterValue bm_register_read(const int32_t cxt_id, const std::string& register_array_name, const int32_t index) {
Logger::get()->trace("bm_register_read");
Data value; // make it thread_local ?
Register::RegisterErrorCode error_code = switch_->register_read(
cxt_id, register_name, (size_t) index, &value);
cxt_id, register_array_name, static_cast<size_t>(index), &value);
if(error_code != Register::RegisterErrorCode::SUCCESS) {
InvalidRegisterOperation iro;
iro.code = (RegisterOperationErrorCode::type) error_code;
Expand All @@ -583,10 +583,33 @@ public:
return value.get<int64_t>();
}

void bm_register_write(const int32_t cxt_id, const std::string& register_name, const int32_t index, const BmRegisterValue value) {
void bm_register_write(const int32_t cxt_id, const std::string& register_array_name, const int32_t index, const BmRegisterValue value) {
Logger::get()->trace("bm_register_write");
Register::RegisterErrorCode error_code = switch_->register_write(
cxt_id, register_name, (size_t) index, Data(value));
cxt_id, register_array_name, static_cast<size_t>(index), Data(value));
if(error_code != Register::RegisterErrorCode::SUCCESS) {
InvalidRegisterOperation iro;
iro.code = (RegisterOperationErrorCode::type) error_code;
throw iro;
}
}

void bm_register_write_range(const int32_t cxt_id, const std::string& register_array_name, const int32_t from, const int32_t to, const BmRegisterValue value) {
Logger::get()->trace("bm_register_write_range");
Register::RegisterErrorCode error_code = switch_->register_write_range(
cxt_id, register_array_name, static_cast<size_t>(from),
static_cast<size_t>(to), Data(value));
if(error_code != Register::RegisterErrorCode::SUCCESS) {
InvalidRegisterOperation iro;
iro.code = (RegisterOperationErrorCode::type) error_code;
throw iro;
}
}

void bm_register_reset(const int32_t cxt_id, const std::string& register_array_name) {
Logger::get()->trace("bm_register_reset");
Register::RegisterErrorCode error_code = switch_->register_reset(
cxt_id, register_array_name);
if(error_code != Register::RegisterErrorCode::SUCCESS) {
InvalidRegisterOperation iro;
iro.code = (RegisterOperationErrorCode::type) error_code;
Expand Down
7 changes: 7 additions & 0 deletions modules/bm_sim/include/bm_sim/context.h
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,13 @@ class Context final {
register_write(const std::string &register_name,
const size_t idx, Data value);

RegisterErrorCode
register_write_range(const std::string &register_name,
const size_t start, const size_t end, Data value);

RegisterErrorCode
register_reset(const std::string &register_name);

MatchErrorCode
dump_table(const std::string& table_name,
std::ostream *stream) const;
Expand Down
9 changes: 9 additions & 0 deletions modules/bm_sim/include/bm_sim/runtime_interface.h
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,15 @@ class RuntimeInterface {
const std::string &register_name,
const size_t idx, Data value) = 0; // to be moved

virtual RegisterErrorCode
register_write_range(size_t cxt_id,
const std::string &register_name,
const size_t start, const size_t end,
Data value) = 0;

virtual RegisterErrorCode
register_reset(size_t cxt_id, const std::string &register_name) = 0;

virtual ErrorCode
load_new_config(const std::string &new_config) = 0;

Expand Down
14 changes: 14 additions & 0 deletions modules/bm_sim/include/bm_sim/switch.h
Original file line number Diff line number Diff line change
Expand Up @@ -497,6 +497,20 @@ class SwitchWContexts : public DevMgr, public RuntimeInterface {
register_name, idx, std::move(value));
}

RegisterErrorCode
register_write_range(size_t cxt_id,
const std::string &register_name,
const size_t start, const size_t end,
Data value) override {
return contexts.at(cxt_id).register_write_range(
register_name, start, end, std::move(value));
}

RegisterErrorCode
register_reset(size_t cxt_id, const std::string &register_name) override {
return contexts.at(cxt_id).register_reset(register_name);
}

RuntimeInterface::ErrorCode
reset_state() override;

Expand Down
26 changes: 26 additions & 0 deletions modules/bm_sim/src/context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -426,6 +426,32 @@ Context::register_write(const std::string &register_name,
return Register::SUCCESS;
}

Context::RegisterErrorCode
Context::register_write_range(const std::string &register_name,
const size_t start, const size_t end,
Data value) {
boost::shared_lock<boost::shared_mutex> lock(request_mutex);
RegisterArray *register_array =
p4objects_rt->get_register_array(register_name);
if (!register_array) return Register::ERROR;
if (end > register_array->size() || start > end)
return Register::INVALID_INDEX;
auto register_lock = register_array->unique_lock();
for (size_t idx = start; idx < end; idx++)
register_array->at(idx).set(value);
return Register::SUCCESS;
}

Context::RegisterErrorCode
Context::register_reset(const std::string &register_name) {
boost::shared_lock<boost::shared_mutex> lock(request_mutex);
RegisterArray *register_array =
p4objects_rt->get_register_array(register_name);
if (!register_array) return Register::ERROR;
register_array->reset_state();
return Register::SUCCESS;
}

MatchErrorCode
Context::dump_table(const std::string& table_name,
std::ostream *stream) const {
Expand Down
13 changes: 13 additions & 0 deletions thrift_src/standard.thrift
Original file line number Diff line number Diff line change
Expand Up @@ -433,6 +433,19 @@ service Standard {
4:BmRegisterValue value
) throws (1:InvalidRegisterOperation ouch)

void bm_register_write_range(
1:i32 cxt_id,
2:string register_array_name,
3:i32 from,
4:i32 to,
5:BmRegisterValue value
) throws (1:InvalidRegisterOperation ouch)

void bm_register_reset(
1:i32 cxt_id,
2:string register_array_name
) throws (1:InvalidRegisterOperation ouch)


// device manager

Expand Down
11 changes: 11 additions & 0 deletions tools/runtime_CLI.py
Original file line number Diff line number Diff line change
Expand Up @@ -1525,6 +1525,17 @@ def do_register_write(self, line):
def complete_register_write(self, text, line, start_index, end_index):
return self._complete_registers(text)

@handle_bad_input
def do_register_reset(self, line):
"Reset all the cells in the register array to 0: register_reset <name>"
args = line.split()
self.exactly_n_args(args, 1)
register_name = args[0]
self.client.bm_register_reset(0, register_name)

def complete_register_reset(self, text, line, start_index, end_index):
return self._complete_registers(text)

def _complete_registers(self, text):
return self._complete_res(REGISTER_ARRAYS, text)

Expand Down

0 comments on commit 483373e

Please sign in to comment.