#include "risc0/zkp/verify/taps.h"
#include "risc0/core/util.h"
namespace risc0 {
TapSetRef TapSet::getRef() const {
return TapSetRef(&data_);
}
TapSet::TapSet(const All& all) {
std::vector<Reg> combos;
std::map<Reg, size_t> combosToID;
std::set<size_t> self = {0};
combos.push_back(self);
combosToID.insert(std::make_pair(self, 0));
for (size_t groupID = 0; groupID < kNumRegisterGroups; groupID++) {
RegisterGroup group = static_cast<RegisterGroup>(groupID);
REQUIRE(all.count(group));
data_.groupBegin[groupID] = taps_.size();
const Group& regs = all.at(group);
size_t regCount = regs.rbegin()->first + 1;
for (size_t reg = 0; reg < regCount; reg++) {
REQUIRE(regs.count(reg));
Reg combo = regs.at(reg);
REQUIRE(combo.size() > 0);
if (!combosToID.count(combo)) {
combosToID[combo] = combos.size();
combos.push_back(combo);
}
size_t comboID = combosToID[combo];
for (size_t back : combo) {
detail::TapData data;
REQUIRE(back < 65536);
REQUIRE(reg < 65536);
REQUIRE(combo.size() < 256);
REQUIRE(comboID < 256);
data.group = group;
data.offset = reg;
data.back = back;
data.combo = comboID;
data.skip = combo.size();
taps_.push_back(data);
}
}
}
data_.groupBegin[kNumRegisterGroups] = taps_.size();
data_.taps = taps_.data();
for (auto combo : combos) {
comboBegin_.push_back(comboTaps_.size());
for (size_t tap : combo) {
comboTaps_.push_back(tap);
}
}
comboBegin_.push_back(comboTaps_.size());
REQUIRE(comboTaps_.size() < 65536);
data_.combos.taps = comboTaps_.data();
data_.combos.offsets = comboBegin_.data();
data_.combos.count = combos.size();
}
}