Skip to content
Snippets Groups Projects
Commit e9d459e1 authored by dam1n19's avatar dam1n19
Browse files

ATO2-24: Created Config Synchroniser to sync config data with an ID stream

parent 15991bf3
No related branches found
No related tags found
No related merge requests found
Showing with 5495 additions and 5036 deletions
//-----------------------------------------------------------------------------
// SoC Labs Basic SHA-256 Configuration Synchroniser
// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
//
// Contributors
//
// David Mapstone (d.a.mapstone@soton.ac.uk)
//
// Copyright 2023, SoC Labs (www.soclabs.org)
//-----------------------------------------------------------------------------
module sha256_config_sync (
input logic clk,
input logic nrst,
input logic en,
// Synchronous, localised reset
input logic sync_rst,
// ID In and Handshaking
input logic [5:0] id_in,
input logic id_in_last,
input logic id_in_valid,
output logic id_in_ready,
// Config data and Handshaking
input logic [63:0] cfg_in_size,
input logic [1:0] cfg_in_scheme,
input logic cfg_in_last,
input logic cfg_in_valid,
output logic cfg_in_ready,
// Data Out data and Handshaking
output logic [63:0] cfg_out_size,
output logic [1:0] cfg_out_scheme,
output logic [5:0] cfg_out_id,
output logic cfg_out_last,
output logic cfg_out_valid,
input logic cfg_out_ready
);
logic [1:0] state, next_state;
logic next_cfg_in_ready;
logic next_id_in_ready;
logic [63:0] next_cfg_out_size;
logic [1:0] next_cfg_out_scheme;
logic [5:0] next_cfg_out_id;
logic next_cfg_out_last;
logic next_cfg_out_valid;
// State Machine Sequential Logic
always_ff @(posedge clk, negedge nrst) begin
if ((!nrst) | sync_rst) begin
state <= 2'd0;
cfg_out_size <= 64'd0;
cfg_out_scheme <= 2'd0;
cfg_out_id <= 6'd0;
cfg_out_last <= 1'b0;
cfg_out_valid <= 1'b0;
cfg_in_ready <= 1'b0;
id_in_ready <= 1'b0;
end else if (en == 1'b1) begin
state <= next_state;
cfg_out_size <= next_cfg_out_size;
cfg_out_scheme <= next_cfg_out_scheme;
cfg_out_id <= next_cfg_out_id;
cfg_out_last <= next_cfg_out_last;
cfg_out_valid <= next_cfg_out_valid;
cfg_in_ready <= next_cfg_in_ready;
id_in_ready <= next_id_in_ready;
end else begin
cfg_out_valid <= 1'b0;
cfg_in_ready <= 1'b0;
id_in_ready <= 1'b0;
end
end
always_comb begin
// Default
next_state = state;
next_cfg_out_size = cfg_out_size;
next_cfg_out_scheme = cfg_out_scheme;
next_cfg_out_id = cfg_out_id;
next_cfg_out_last = cfg_out_last;
next_cfg_out_valid = cfg_out_valid;
next_cfg_in_ready = cfg_in_ready;
next_id_in_ready = id_in_ready;
// Override
case (state)
2'd0: begin
next_cfg_in_ready = 1'b1;
next_id_in_ready = 1'b1;
next_state = 2'd1;
end
2'd1: begin
// Check outputs can be written to
if (cfg_out_valid && !cfg_out_ready) begin
// If data out is valid and ready is low, there is already data waiting to be transferred
next_cfg_in_ready = 1'b0;
next_id_in_ready = 1'b0;
// If there is no Valid data at the output or there is a valid transfer happening on this clock cycle
end else begin
// These can be overloaded later if data is written to the outputs
next_cfg_out_valid = 1'b0;
next_cfg_in_ready = 1'b1;
next_id_in_ready = 1'b1;
next_cfg_out_last = 1'b0;
// Check cfg input
if (cfg_in_ready && cfg_in_valid) begin
next_cfg_out_last = cfg_in_last;
next_cfg_out_scheme = cfg_in_scheme;
next_cfg_out_size = cfg_in_size;
next_cfg_in_ready = 1'b0;
next_state = 2'd2;
end
// Check Id input
if (id_in_ready && id_in_valid) begin
next_cfg_out_id = id_in;
next_id_in_ready = 1'b0;
next_state = 2'd3;
end
// Check if both inputs handshaked
if ((id_in_ready && id_in_valid) && (cfg_in_ready && cfg_in_valid)) begin
next_cfg_out_valid = 1'b1;
if (!cfg_out_valid && cfg_out_ready) begin
// In case where no valid data and ready is waiting for valid data
// - (will be asserted next cc), guaranteed handshake next cycle
next_cfg_in_ready = 1'b1;
next_cfg_in_ready = 1'b1;
end else begin
next_cfg_in_ready = 1'b0;
next_id_in_ready = 1'b0;
end
next_state = 2'd1;
end
end
end
2'd2: begin // Cfg already handshaked - wait for ID handshake
// These can be overloaded later if data is written to the outputs
next_cfg_out_valid = 1'b0;
next_cfg_in_ready = 1'b0;
next_id_in_ready = 1'b1;
// Check Id input
if (id_in_ready && id_in_valid) begin
next_cfg_out_id = id_in;
next_cfg_out_valid = 1'b1;
if (cfg_out_ready) begin // Guaranteeded Handshake next clock cycle
next_cfg_in_ready = 1'b1;
next_id_in_ready = 1'b1;
end else begin
next_cfg_in_ready = 1'b0;
next_id_in_ready = 1'b0;
end
next_state = 2'd1;
end
end
2'd3: begin // ID already handshaked - wait for config handshake
// These can be overloaded later if data is written to the outputs
next_cfg_out_valid = 1'b0;
next_cfg_in_ready = 1'b1;
next_id_in_ready = 1'b0;
// Check config input
if (cfg_in_ready && cfg_in_valid) begin
next_cfg_out_last = cfg_in_last;
next_cfg_out_scheme = cfg_in_scheme;
next_cfg_out_size = cfg_in_size;
next_cfg_out_valid = 1'b1;
if (cfg_out_ready) begin // Guaranteeded Handshake next clock cycle
next_cfg_in_ready = 1'b1;
next_id_in_ready = 1'b1;
end else begin
next_cfg_in_ready = 1'b0;
next_id_in_ready = 1'b0;
end
next_state = 2'd1;
end
end
endcase
end
endmodule
\ No newline at end of file
...@@ -68,7 +68,7 @@ module sha256_id_issue ( ...@@ -68,7 +68,7 @@ module sha256_id_issue (
// Override // Override
case (state) case (state)
1'd0: begin // Get Packet ID Seed 1'd0: begin
next_id_out_cfg_valid = 1'b1; next_id_out_cfg_valid = 1'b1;
next_id_out_buf_valid = 1'b1; next_id_out_buf_valid = 1'b1;
next_state = 1'd1; next_state = 1'd1;
......
//-----------------------------------------------------------------------------
// SoC Labs Basic SHA-2 Config Synchroniser Testbench
// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
//
// Contributors
//
// David Mapstone (d.a.mapstone@soton.ac.uk)
//
// Copyright 2022, SoC Labs (www.soclabs.org)
//-----------------------------------------------------------------------------
`timescale 1ns/1ns
`include "sha256_config_sync.sv"
module tb_sha256_config_sync;
logic clk;
logic nrst;
logic en;
logic sync_rst;
// Data In data and Handshaking
logic [5:0] id_in;
logic id_in_last;
logic id_in_valid;
logic id_in_ready;
// Config data and Handshaking
logic [63:0] cfg_in_size;
logic [1:0] cfg_in_scheme;
logic cfg_in_last;
logic cfg_in_valid;
logic cfg_in_ready;
// Data Out data and Handshaking
logic [63:0] cfg_out_size;
logic [1:0] cfg_out_scheme;
logic [5:0] cfg_out_id;
logic cfg_out_last;
logic cfg_out_valid;
logic cfg_out_ready;
sha256_config_sync uut (
.clk (clk),
.nrst (nrst),
.en (en),
.sync_rst (sync_rst),
.id_in (id_in),
.id_in_last (id_in_last),
.id_in_valid (id_in_valid),
.id_in_ready (id_in_ready),
.cfg_in_size (cfg_in_size),
.cfg_in_scheme (cfg_in_scheme),
.cfg_in_last (cfg_in_last),
.cfg_in_valid (cfg_in_valid),
.cfg_in_ready (cfg_in_ready),
.cfg_out_size (cfg_out_size),
.cfg_out_scheme (cfg_out_scheme),
.cfg_out_id (cfg_out_id),
.cfg_out_last (cfg_out_last),
.cfg_out_valid (cfg_out_valid),
.cfg_out_ready (cfg_out_ready));
logic id_in_drive_en;
logic cfg_in_drive_en;
logic cfg_out_drive_ready;
logic [5:0] id_in_queue [$];
logic id_in_last_queue [$];
int id_in_gap_queue [$];
logic id_in_wait_queue;
logic [63:0] cfg_in_size_queue [$];
logic [1:0] cfg_in_scheme_queue [$];
logic cfg_in_last_queue [$];
int cfg_in_gap_queue [$];
logic cfg_in_wait_queue;
logic [63:0] cfg_out_size_queue [$];
logic [1:0] cfg_out_scheme_queue [$];
logic [5:0] cfg_out_id_queue [$];
logic cfg_out_last_queue [$];
int cfg_out_stall_queue [$];
logic cfg_out_wait_queue;
// Handle Valid and Data for id_in
always_ff @(posedge clk, negedge nrst) begin: id_in_valid_drive
if (!nrst) begin
id_in <= 512'd0;
id_in_valid <= 1'b0;
id_in_last <= 1'b0;
id_in_gap <= 0;
id_in_wait_queue <= 1'b1;
end else if (id_in_drive_en) begin
if (id_in_gap > 1) begin
id_in_gap <= id_in_gap -1;
id_in_valid <= 1'b0;
end else begin
id_in_valid <= 1'b1;
end
if (((id_in_valid == 1'b1) && (id_in_ready == 1'b1)) ||
(id_in_wait_queue == 1'b1)) begin
// Data transfer just completed or transfers already up to date
if ((id_in_queue.size() > 0) && (id_in_last_queue.size() > 0) && (id_in_gap_queue.size() > 0)) begin
id_in <= id_in_queue.pop_front();
id_in_last <= id_in_last_queue.pop_front();
if (id_in_gap_queue[0] == 0) begin
id_in_valid <= 1'b1;
end else begin
id_in_valid <= 1'b0;
end
id_in_gap <= id_in_gap_queue.pop_front();
id_in_wait_queue <= 1'b0;
end else begin
// No data currently avaiable in queue to write but transfers up to date
id_in_wait_queue <= 1'b1;
id_in_valid <= 1'b0;
end
end
end
end
// Handle Valid and Data for cfg_in
always_ff @(posedge clk, negedge nrst) begin: cfg_in_valid_drive
if (!nrst) begin
cfg_in_size <= 64'd0;
cfg_in_scheme <= 2'd0;
cfg_in_valid <= 1'b0;
cfg_in_last <= 1'b0;
cfg_in_gap <= 0;
cfg_in_wait_queue <= 1'b1;
end else if (cfg_in_drive_en) begin
if (cfg_in_gap > 1) begin
cfg_in_gap <= cfg_in_gap -1;
cfg_in_valid <= 1'b0;
end else begin
cfg_in_valid <= 1'b1;
end
if (((cfg_in_valid == 1'b1) && (cfg_in_ready == 1'b1)) ||
(cfg_in_wait_queue == 1'b1)) begin
// cfg_in transfer just completed or transfers already up to date
if ((cfg_in_size_queue.size() > 0) && (cfg_in_scheme_queue.size() > 0 ) && (cfg_in_last_queue.size() > 0) && (cfg_in_gap_queue.size() > 0)) begin
cfg_in_size <= cfg_in_size_queue.pop_front();
cfg_in_scheme <= cfg_in_scheme_queue.pop_front();
cfg_in_last <= cfg_in_last_queue.pop_front();
if (cfg_in_gap_queue[0] == 0) begin
cfg_in_valid <= 1'b1;
end else begin
cfg_in_valid <= 1'b0;
end
cfg_in_gap <= cfg_in_gap_queue.pop_front();
cfg_in_wait_queue <= 1'b0;
end else begin
// No data currently avaiable in queue to write but transfers up to date
cfg_in_wait_queue <= 1'b1;
cfg_in_valid <= 1'b0;
end
end
end
end
logic [63:0] cfg_out_size_check;
logic [1:0] cfg_out_scheme_check;
logic [5:0] cfg_out_id_check;
logic cfg_out_last_check;
int id_in_gap;
int cfg_in_gap;
int cfg_out_stall;
int packet_num;
// Handle Output Ready Signal Verification
always @(posedge clk) begin
// Check Override Control on Ready
if (cfg_out_drive_ready) begin
// Count down to zero before enabling Ready
if (cfg_out_stall > 1) begin
cfg_out_stall <= cfg_out_stall - 1;
cfg_out_ready <= 1'b0;
end else begin
// Wait for handshake before updating stall value
if ((cfg_out_valid == 1'b1) && (cfg_out_ready == 1'b1)) begin
if (cfg_out_stall_queue.size() > 0) begin
if (cfg_out_stall_queue[0] == 0) begin
cfg_out_ready <= 1'b1;
end else begin
cfg_out_ready <= 1'b0;
end
cfg_out_stall <= cfg_out_stall_queue.pop_front();
end
// Keep Ready Asserted until handshake seen
end else begin
cfg_out_ready <= 1'b1;
end
end
end else begin
cfg_out_ready <= 1'b0;
end
end
// Handle Output Data Verification
always @(posedge clk) begin
// Check Data on Handshake
if ((cfg_out_valid == 1'b1) && (cfg_out_ready == 1'b1)) begin
// Check Size
assert (cfg_out_size == cfg_out_size_check) else begin
$error("cfg_out_size missmatch! packet %d | recieve: %x != check: %x", packet_num, cfg_out_size, cfg_out_size_check);
$finish;
end
if ($test$plusargs ("DEBUG")) $display("cfg_out_size match! packet %d | recieve: %x == check: %x", packet_num, cfg_out_size, cfg_out_size_check);
// Check Scheme
assert (cfg_out_scheme == cfg_out_scheme_check) else begin
$error("cfg_out_scheme missmatch! packet %d | recieve: %x != check: %x", packet_num, cfg_out_scheme, cfg_out_scheme_check);
$finish;
end
if ($test$plusargs ("DEBUG")) $display("cfg_out_scheme match! packet %d | recieve: %x == check: %x", packet_num, cfg_out_scheme, cfg_out_scheme_check);
// Check ID
assert (cfg_out_id == cfg_out_id_check) else begin
$error("cfg_out_id missmatch! packet %d | recieve: %x != check: %x", packet_num, cfg_out_id, cfg_out_id_check);
$finish;
end
if ($test$plusargs ("DEBUG")) $display("cfg_out_id match! packet %d | recieve: %x == check: %x", packet_num, cfg_out_id, cfg_out_id_check);
// Check Last Flag
assert (cfg_out_last == cfg_out_last_check) else begin
$error("cfg_out_last missmatch! packet %d | recieve: %x != check: %x", packet_num, cfg_out_last, cfg_out_last_check);
$finish;
end
if ($test$plusargs ("DEBUG")) $display("cfg_out_last match! packet %d | recieve: %x == check: %x", packet_num, cfg_out_last, cfg_out_last_check);
// Pop new values
if ((cfg_out_size_queue.size() > 0) && (cfg_out_scheme_queue.size() > 0) && (cfg_out_id_queue.size() > 0) && (cfg_out_last_queue.size() > 0)) begin
cfg_out_size_check <= cfg_out_size_queue.pop_front();
cfg_out_scheme_check <= cfg_out_scheme_queue.pop_front();
cfg_out_id_check <= cfg_out_id_queue.pop_front();
cfg_out_last_check <= cfg_out_last_queue.pop_front();
if (cfg_out_last_check == 1'b1) begin
packet_num <= packet_num + 1;
end
end else begin
$display("Test Passes");
$finish;
end
end
end
// File Reading Variables
int fd; // File descriptor Handle
logic [5:0] temp_id_in; // Temporary Input Data Storage
logic temp_id_in_last; // Temporary Input Data Last
int temp_id_in_gap; // Temporary Input Gap
logic [63:0] temp_cfg_in_size; // Temporary cfg size
logic [1:0] temp_cfg_in_scheme; // Temporary cfg scheme
logic temp_cfg_in_last; // Temporary cfg last;
int temp_cfg_in_gap; // Temporary cfg gap;
logic [63:0] temp_cfg_out_size; // Temporary cfg size
logic [1:0] temp_cfg_out_scheme; // Temporary cfg scheme
logic [5:0] temp_cfg_out_id; // Temporary cfg id
logic temp_cfg_out_last; // Temporary cfg last;
int temp_cfg_out_stall; // Temporary cfg stall;
initial begin
$dumpfile("sha256_config_sync.vcd");
$dumpvars(0, tb_sha256_config_sync);
id_in_drive_en = 0;
cfg_in_drive_en = 0;
cfg_out_drive_ready = 0;
// Read input data into Queue
fd = $fopen("../stimulus/testbench/input_id_stim.csv", "r");
while ($fscanf (fd, "%d,%b,%d", temp_id_in, temp_id_in_last, temp_id_in_gap) == 3) begin
id_in_queue.push_back(temp_id_in);
id_in_last_queue.push_back(temp_id_in_last);
id_in_gap_queue.push_back(temp_id_in_gap);
end
$fclose(fd);
// Read input cfg into Queue
fd = $fopen("../stimulus/testbench/input_cfg_stim.csv", "r");
while ($fscanf (fd, "%x,%x,%b,%d", temp_cfg_in_size, temp_cfg_in_scheme, temp_cfg_in_last, temp_cfg_in_gap) == 4) begin
cfg_in_size_queue.push_back(temp_cfg_in_size);
cfg_in_scheme_queue.push_back(temp_cfg_in_scheme);
cfg_in_last_queue.push_back(temp_cfg_in_last);
cfg_in_gap_queue.push_back(temp_cfg_in_gap);
end
$fclose(fd);
// Read output data into Queue
fd = $fopen("../stimulus/testbench/output_cfg_sync_ref.csv", "r");
while ($fscanf (fd, "%x,%x,%d,%b,%d", temp_cfg_out_size, temp_cfg_out_scheme, temp_cfg_out_id, temp_cfg_out_last, temp_cfg_out_stall) == 5) begin
cfg_out_size_queue.push_back(temp_cfg_out_size);
cfg_out_scheme_queue.push_back(temp_cfg_out_scheme);
cfg_out_id_queue.push_back(temp_cfg_out_id);
cfg_out_last_queue.push_back(temp_cfg_out_last);
cfg_out_stall_queue.push_back(temp_cfg_out_stall);
end
$fclose(fd);
// Initialise First Checking Values
cfg_out_size_check = cfg_out_size_queue.pop_front();
cfg_out_scheme_check = cfg_out_scheme_queue.pop_front();
cfg_out_id_check = cfg_out_id_queue.pop_front();
cfg_out_last_check = cfg_out_last_queue.pop_front();
cfg_out_stall = cfg_out_stall_queue.pop_front();
// Defaultly enable Message Builder
en = 1;
// Defaultly set Sync Reset Low
sync_rst = 0;
#20 nrst = 1;
#20 nrst = 0;
#20 nrst = 1;
#20 cfg_in_drive_en = 1;
// Write some data into the config register
# 30 id_in_drive_en = 1;
# 30 cfg_out_drive_ready = 1;
end
initial begin
forever begin
#10 clk = 0;
#10 clk = 1;
end
end
endmodule
\ No newline at end of file
...@@ -32,8 +32,11 @@ def main(): ...@@ -32,8 +32,11 @@ def main():
random.seed(seed) random.seed(seed)
print(f"Generating {packets} packets using seed: {seed}") print(f"Generating {packets} packets using seed: {seed}")
cfg_words_list = [] in_cfg_words_list = []
cfg_words_gap_list = [] in_cfg_words_gap_list = []
sync_cfg_size_list = []
sync_cfg_id_list = []
sync_cfg_stall_list = []
in_data_words_list = [] in_data_words_list = []
in_data_words_last_list = [] in_data_words_last_list = []
in_data_words_gap_list = [] in_data_words_gap_list = []
...@@ -44,9 +47,7 @@ def main(): ...@@ -44,9 +47,7 @@ def main():
hash_list = [] hash_list = []
hash_stall_list = [] hash_stall_list = []
# ID Lists # ID Lists
id_seed_list = [] id_gap_list = []
id_use_seed_list = []
id_seed_gap_list = [] # Doesn't work in this scenario - ID counter increments when id seed is gapping
expected_id_list = [] expected_id_list = []
expected_id_stall_list = [] expected_id_stall_list = []
...@@ -56,14 +57,18 @@ def main(): ...@@ -56,14 +57,18 @@ def main():
# Gapping - Period to wait before taking Input Valid High # Gapping - Period to wait before taking Input Valid High
# Stalling - Period to wait before taking Output Read High # Stalling - Period to wait before taking Output Read High
if gap_limit > 0: if gap_limit > 0:
cfg_words_gap_list.append(random.randrange(0,gap_limit)) id_gap_list.append(random.randrange(0,gap_limit))
in_cfg_words_gap_list.append(random.randrange(0,gap_limit))
else: else:
cfg_words_gap_list.append(0) id_gap_list.append(0)
in_cfg_words_gap_list.append(0)
if stall_limit > 0: if stall_limit > 0:
hash_stall_list.append(random.randrange(0,stall_limit)) hash_stall_list.append(random.randrange(0,stall_limit))
sync_cfg_stall_list.append(random.randrange(0,stall_limit))
else: else:
hash_stall_list.append(0) hash_stall_list.append(0)
sync_cfg_stall_list.append(0)
# Generate expected output in 512 bit chunks # Generate expected output in 512 bit chunks
cfg_size = math.ceil(random.randint(0,pow(2,14))/8)*8 cfg_size = math.ceil(random.randint(0,pow(2,14))/8)*8
...@@ -80,12 +85,9 @@ def main(): ...@@ -80,12 +85,9 @@ def main():
else: else:
id_stall_value = 0 id_stall_value = 0
if gap_limit > 0:
id_seed_gap_list.append(random.randrange(0,gap_limit))
else:
id_seed_gap_list.append(0)
expected_id_list.append(id_value) expected_id_list.append(id_value)
sync_cfg_id_list.append(id_value)
# Reference Values # Reference Values
id_value += 1 id_value += 1
...@@ -138,7 +140,8 @@ def main(): ...@@ -138,7 +140,8 @@ def main():
message_block_gap.append(0) message_block_gap.append(0)
message_block_last[-1] = "1" message_block_last[-1] = "1"
cfg_words_list.append(cfg_size_str) in_cfg_words_list.append(cfg_size_str)
sync_cfg_size_list.append(cfg_size_str)
in_data_words_list += in_data_words in_data_words_list += in_data_words
in_data_words_last_list += in_data_words_last in_data_words_last_list += in_data_words_last
in_data_words_gap_list += in_data_words_gap in_data_words_gap_list += in_data_words_gap
...@@ -154,10 +157,10 @@ def main(): ...@@ -154,10 +157,10 @@ def main():
# Write out Input ID Seed to Text File # Write out Input ID Seed to Text File
input_header = ["id_seed", "use_seed", "last"] input_header = ["id_seed", "use_seed", "last"]
with open(os.environ["SHA_2_ACC_DIR"] + "/simulate/stimulus/testbench/" + "input_id_seed_stim.csv", "w", encoding="UTF8", newline='') as f: with open(os.environ["SHA_2_ACC_DIR"] + "/simulate/stimulus/testbench/" + "input_id_stim.csv", "w", encoding="UTF8", newline='') as f:
writer = csv.writer(f) writer = csv.writer(f)
for idx, word in enumerate(id_seed_list): for idx, word in enumerate(expected_id_list):
writer.writerow([word, id_use_seed_list[idx], "1"]) writer.writerow([expected_id_list[idx], "1", id_gap_list[idx]])
# Write out Output ID Values to Text File # Write out Output ID Values to Text File
input_header = ["expected_id_value, id_last, stall_value"] input_header = ["expected_id_value, id_last, stall_value"]
...@@ -177,8 +180,15 @@ def main(): ...@@ -177,8 +180,15 @@ def main():
input_header = ["input_cfg_size", "input_cfg_scheme", "input_cfg_last"] input_header = ["input_cfg_size", "input_cfg_scheme", "input_cfg_last"]
with open(os.environ["SHA_2_ACC_DIR"] + "/simulate/stimulus/testbench/" + "input_cfg_stim.csv", "w", encoding="UTF8", newline='') as f: with open(os.environ["SHA_2_ACC_DIR"] + "/simulate/stimulus/testbench/" + "input_cfg_stim.csv", "w", encoding="UTF8", newline='') as f:
writer = csv.writer(f) writer = csv.writer(f)
for idx, word in enumerate(cfg_words_list): for idx, word in enumerate(in_cfg_words_list):
writer.writerow(["{0:x}".format(int(word, 2)), "0", "1", cfg_words_gap_list[idx]]) writer.writerow(["{0:x}".format(int(word, 2)), "0", "1", in_cfg_words_gap_list[idx]])
# Write out Cfg sync reference to Text File
input_header = ["input_cfg_size", "input_cfg_scheme", "input_cfg_last"]
with open(os.environ["SHA_2_ACC_DIR"] + "/simulate/stimulus/testbench/" + "output_cfg_sync_ref.csv", "w", encoding="UTF8", newline='') as f:
writer = csv.writer(f)
for idx, word in enumerate(sync_cfg_size_list):
writer.writerow(["{0:x}".format(int(word, 2)), "0", sync_cfg_id_list[idx], "1", sync_cfg_stall_list[idx]])
# Write out Expected output to text file # Write out Expected output to text file
output_header = ["output_data", "output_data_last"] output_header = ["output_data", "output_data_last"]
......
fd8,0,1,2 718,0,1,2
2b30,0,1,1 3d08,0,1,1
1e40,0,1,2 3800,0,1,0
21b8,0,1,1
dc0,0,1,0 dc0,0,1,0
2e28,0,1,2 640,0,1,2
e08,0,1,2 1278,0,1,2
2b58,0,1,1 1dc0,0,1,1
1818,0,1,1 c80,0,1,1
25b8,0,1,1 a50,0,1,2
2a8,0,1,1 1c8,0,1,0
1b90,0,1,1 1258,0,1,1
1750,0,1,2 458,0,1,2
3d48,0,1,0 20b0,0,1,2
13b0,0,1,2 3a8,0,1,1
a98,0,1,0 1968,0,1,2
2988,0,1,1 1228,0,1,1
27d8,0,1,0 1910,0,1,2
1c80,0,1,1
1858,0,1,1
21f8,0,1,0
258,0,1,1
2a20,0,1,2
2328,0,1,1
9f8,0,1,1
3e08,0,1,2 3e08,0,1,2
1250,0,1,2 38,0,1,2
12e8,0,1,0 3508,0,1,1
3828,0,1,2 1930,0,1,2
818,0,1,1 1c80,0,1,1
2018,0,1,2 678,0,1,0
3548,0,1,2 3a48,0,1,1
1520,0,1,0 e98,0,1,2
2448,0,1,2 29a8,0,1,2
1a40,0,1,2 1c90,0,1,0
17b0,0,1,1 3138,0,1,2
da8,0,1,2 1a70,0,1,1
948,0,1,2 1be8,0,1,2
24b8,0,1,2 1858,0,1,0
35b8,0,1,2 5f8,0,1,1
858,0,1,0 1108,0,1,1
17b8,0,1,1 11e8,0,1,2
1518,0,1,1 23f8,0,1,2
2938,0,1,0 928,0,1,1
6c8,0,1,0 3500,0,1,0
1310,0,1,0 30c0,0,1,0
3208,0,1,1 3650,0,1,1
3650,0,1,2
3318,0,1,2 3318,0,1,2
14b0,0,1,1 14b0,0,1,1
30f0,0,1,0 1930,0,1,0
3f38,0,1,2 1730,0,1,0
2018,0,1,2 2278,0,1,2
3070,0,1,2 18,0,1,1
1d60,0,1,1 30c8,0,1,1
2af8,0,1,2 2238,0,1,0
a0,0,1,0 420,0,1,2
fc8,0,1,0 1a10,0,1,2
1430,0,1,2 2a0,0,1,2
2b20,0,1,2 768,0,1,0
6b0,0,1,2 2e28,0,1,0
1d38,0,1,0 2c30,0,1,0
3280,0,1,2 22f8,0,1,2
990,0,1,2 2178,0,1,1
2ce8,0,1,2 11c0,0,1,1
1e08,0,1,0 1d30,0,1,0
1b18,0,1,0 c40,0,1,2
b00,0,1,0 2308,0,1,0
2980,0,1,2 2690,0,1,1
15a8,0,1,1 3ca8,0,1,2
1c58,0,1,1 24a0,0,1,0
23f8,0,1,0 3ab8,0,1,2
b40,0,1,0 2980,0,1,1
118,0,1,0 2730,0,1,1
1920,0,1,0 3858,0,1,0
3e60,0,1,0 950,0,1,2
3bb8,0,1,1 2938,0,1,1
3218,0,1,1 1eb0,0,1,1
1028,0,1,1 3af0,0,1,1
d90,0,1,2 1e20,0,1,0
1e98,0,1,2 21e8,0,1,2
2298,0,1,2 b60,0,1,1
1d0,0,1,2 df8,0,1,1
24e0,0,1,1 a60,0,1,2
3d68,0,1,1 1470,0,1,1
19a0,0,1,1 1ae0,0,1,1
1110,0,1,0 10d8,0,1,0
1480,0,1,2 3b8,0,1,1
3278,0,1,0 d68,0,1,0
32b8,0,1,0 27c0,0,1,0
27a0,0,1,1 3be0,0,1,1
17a8,0,1,2 900,0,1,0
1500,0,1,2 3b50,0,1,2
2b28,0,1,0 10d8,0,1,2
1988,0,1,2 3ca0,0,1,0
3098,0,1,2 3b28,0,1,2
448,0,1,1 1fc8,0,1,1
35a0,0,1,1 3c18,0,1,2
2218,0,1,2 2490,0,1,2
3338,0,1,0 26d8,0,1,1
34e0,0,1,1 3658,0,1,1
2800,0,1,0 c90,0,1,0
39c8,0,1,0
c8,0,1,1
1438,0,1,1
1230,0,1,1
2fe8,0,1,1
Source diff could not be displayed: it is too large. Options to address this: view the blob.
0,1,2
1,1,1
2,1,1
3,1,0
4,1,1
5,1,1
6,1,1
7,1,0
8,1,2
9,1,1
10,1,1
11,1,2
12,1,1
13,1,2
14,1,2
15,1,1
16,1,1
17,1,2
18,1,2
19,1,0
20,1,1
21,1,2
22,1,0
23,1,1
24,1,1
25,1,1
26,1,0
27,1,0
28,1,0
29,1,2
30,1,1
31,1,1
32,1,0
33,1,2
34,1,2
35,1,2
36,1,0
37,1,2
38,1,0
39,1,2
40,1,2
41,1,1
42,1,0
43,1,1
44,1,2
45,1,0
46,1,1
47,1,2
48,1,2
49,1,0
50,1,0
51,1,0
52,1,0
53,1,1
54,1,0
55,1,0
56,1,1
57,1,1
58,1,1
59,1,2
60,1,2
61,1,0
62,1,1
63,1,2
0,1,2
1,1,0
2,1,0
3,1,2
4,1,2
5,1,0
6,1,2
7,1,0
8,1,0
9,1,0
10,1,0
11,1,0
12,1,2
13,1,0
14,1,2
15,1,0
16,1,2
17,1,0
18,1,2
19,1,2
20,1,2
21,1,0
22,1,0
23,1,2
24,1,1
25,1,1
26,1,2
27,1,2
28,1,0
29,1,2
30,1,1
31,1,0
32,1,0
33,1,2
34,1,2
35,1,1
Source diff could not be displayed: it is too large. Options to address this: view the blob.
718,0,0,1,0
3d08,0,1,1,2
3800,0,2,1,2
dc0,0,3,1,2
640,0,4,1,1
1278,0,5,1,2
1dc0,0,6,1,0
c80,0,7,1,2
a50,0,8,1,2
1c8,0,9,1,2
1258,0,10,1,0
458,0,11,1,1
20b0,0,12,1,1
3a8,0,13,1,0
1968,0,14,1,1
1228,0,15,1,1
1910,0,16,1,2
1c80,0,17,1,1
1858,0,18,1,0
21f8,0,19,1,2
258,0,20,1,1
2a20,0,21,1,0
2328,0,22,1,2
9f8,0,23,1,0
3e08,0,24,1,2
38,0,25,1,0
3508,0,26,1,0
1930,0,27,1,0
1c80,0,28,1,2
678,0,29,1,1
3a48,0,30,1,2
e98,0,31,1,2
29a8,0,32,1,1
1c90,0,33,1,2
3138,0,34,1,1
1a70,0,35,1,2
1be8,0,36,1,0
1858,0,37,1,1
5f8,0,38,1,2
1108,0,39,1,1
11e8,0,40,1,2
23f8,0,41,1,1
928,0,42,1,0
3500,0,43,1,0
30c0,0,44,1,0
3650,0,45,1,1
3318,0,46,1,2
14b0,0,47,1,2
1930,0,48,1,1
1730,0,49,1,0
2278,0,50,1,1
18,0,51,1,0
30c8,0,52,1,2
2238,0,53,1,0
420,0,54,1,1
1a10,0,55,1,2
2a0,0,56,1,2
768,0,57,1,2
2e28,0,58,1,1
2c30,0,59,1,0
22f8,0,60,1,1
2178,0,61,1,0
11c0,0,62,1,1
1d30,0,63,1,2
c40,0,0,1,0
2308,0,1,1,1
2690,0,2,1,2
3ca8,0,3,1,0
24a0,0,4,1,0
3ab8,0,5,1,1
2980,0,6,1,2
2730,0,7,1,0
3858,0,8,1,0
950,0,9,1,0
2938,0,10,1,0
1eb0,0,11,1,1
3af0,0,12,1,1
1e20,0,13,1,0
21e8,0,14,1,1
b60,0,15,1,0
df8,0,16,1,2
a60,0,17,1,2
1470,0,18,1,2
1ae0,0,19,1,1
10d8,0,20,1,2
3b8,0,21,1,2
d68,0,22,1,0
27c0,0,23,1,1
3be0,0,24,1,1
900,0,25,1,0
3b50,0,26,1,0
10d8,0,27,1,2
3ca0,0,28,1,2
3b28,0,29,1,2
1fc8,0,30,1,1
3c18,0,31,1,1
2490,0,32,1,2
26d8,0,33,1,2
3658,0,34,1,2
c90,0,35,1,2
77d23a738ff71d25cd40111b2da0c6dca53ef1ed723aa630ee913bfba85f96c8,1,2 eec110c2f50fb5d45bfd9bc9e7ba1afcc0be8b4ef9f8c434e57950152e278363,1,0
00fb6ba8c9c6e911811a13f782442b157224b2e85ffd3b5834a2a3dfffe5ce18,1,1 f909a5ffce3c39bfb3104d9278f76b909dfbeb7c72f318dc8523ab11b6017090,1,1
8468c4a94ab7e1052637bf8262fbc6619e81590446595b5d649530021ca6a99a,1,0 bca58d138346c71535f7105fe4ecd57c0bcea4af11a5c7624b4fd62c31851cd3,1,1
4a7bc2728c1f8471cb2f1ba320ae252b7c92ca36d5ac2013b19da60e08540549,1,1 2cf2aaad835c4e557fa24897f6b87667a3c178051b3ca8eae67fa91346a86d24,1,2
2cf2aaad835c4e557fa24897f6b87667a3c178051b3ca8eae67fa91346a86d24,1,0 35a06199ff501ac21d4233bf7a6d25a3e09603cf0f16bfb73752bf9684bf9b2f,1,2
1fd16e69bfeaa3115688bee612955c1622905b8d120157cfef600ea02c66a7ea,1,2 88b6ec38427d9b17552a64632400e0d6f880c8590c92f76ac794a578e1757ffc,1,2
29394198e030f6b243ecdd6b508188a294a0ebfab55c2abd58c033cc8c6a2444,1,1 a56b6d54666f68725f9c061a45c4bfb59528158a93ba81599958b8d789af6040,1,1
0ab1ec0858556429730792f73efa7c6b72d91ee8a43dfdefc81d22baa42756f9,1,1 52952e0cc3f1d7cef48e3f32f7eccd9e355dd5371a63ce8c8cf0ac8c8968d6ac,1,2
7e67b6f78c921f3f2f168270156dceeb02cc89a013f83b0410c63d849a82a7a2,1,1 c50f6cb58fb23704559d33a87a623dd02bc397c95c2d5878c0f23aca52a746a9,1,0
cdfea393ee92cf9038364cac0bd1a021a16af7760bcfb58fc23f0b8321d94f3c,1,1 dc6851fdd9c67feaa69b5a3b2b31e37e153c27b426316793aa085895bf8771c0,1,0
9653d717ee509100f5edae53a76e10a1ce919c489c5a3bb3d17d63596151ce2d,1,2 71239b5cfbc19e1cf609fbe3beeef85e15661bae9ebd212781ae45d4cfdc9024,1,2
631cb62b720400c315dbe344c989b0833d0fba345b6f856c1936b695e85fd130,1,1 8b68f60808e8ef66934656e0f02d898dd9db7bf6c9a32cf9c3e0ef4a1e24ddda,1,2
278a02bc5afd5a0e50e01b1f59cd48ece3e2044476f5c77788fc10e52d89c287,1,2 7a8e26790d709976def2b47b89f4ec788ebfe0fbabdcb59c00b339e9441ab9a8,1,2
e5be3e40b035206246bb7794d57594a8da37ec51d7d50c484c642a6e94834dcf,1,2 b195f54e833faf94dfd1088b448e27602c6f7f2ceea6b930037e3ae21d8900d4,1,0
c0285858bbaf436fb480c9b4ef74258d48cd14af5c4a7dc221802923f37957f0,1,2 ae1301202c1c94d77badc2283b7e0006fbe7847784a9b0f9db7956ab56f807cd,1,1
c9f64a9fe8184d8fb3a9a095557fb7b675083969bc3162fc1fbee02f249c8b9b,1,2 29ce1d81699fad1cbd46893a8890f8d4794c943cd3dc2fe4cbaba1735df2e063,1,0
81dceb0ab99ae9069356fb9553b6f41dbf2fb0fa87b542288e2d630bf126d1c2,1,2 b0e6d839a2ed92539ea11e52ae0a12f99589888101787b0580f3001ac92febcd,1,0
01d0949d1c7d63ac77cdd4048ceed79d7d900766e98ec82591adcdca84641591,1,1 ec283a687a761e9c369fa56fd11aeda350e90a8598b6589def0f94d4928f4bf9,1,2
cff2268d89ccf74500abbd3573c04c5f3aec12713ad8736bee5adba4bc3fb24a,1,1
653f3415aee10f739ae4231b17063acd35549c6a5702055b9edf0ccd052cea48,1,1
ac2241b42ab756522c3967d97fcdf3b55d0856c27cb3ef33ee86964a7cadf4f5,1,2
5becbd245aaf6b2f5331b324bf24f6c09e7184a048de5b3e5f414147a15fe906,1,1
e48a649307aec2d630cf7f16d05b1a9eb44c93510b08a2bc2a4edb0733876662,1,1
0ed53354625d13aa87f94be3a79bd0f7cbccc9a343b0e471bc5b01f2525c7e8c,1,2
7733a1b48bf7ad529bdeb0fec7f6e26359c8642d8d1426b2790ab1546b42932a,1,2 7733a1b48bf7ad529bdeb0fec7f6e26359c8642d8d1426b2790ab1546b42932a,1,2
16e5b6806e251075196ed7bf99c28744bc994c421ef17ed23e889cb48a432d74,1,1 2b8a039c232a83b457d343638869c7e54765ca33a4167683e7e5925b7e6ab605,1,1
3acb8125406e4196ac490a43595833828af606b9a3e19d21cac74a6e508cfd30,1,1 2161868f3d67221c316f0f81809aee51b8985d29ac309af647f89d041eb5b1f8,1,0
211df3953c45e2697d97710174ee57c2ed521939a423785b9d5b56b73d1b8258,1,1 e16735d170f450944771f9aee4f7de2341ced9dc42f928b97d0d488d7eec407e,1,1
13fbaba788e9d173eeb255991585ac4a789927d7eb58ab63aa1078964e1142e2,1,1 18aaf3d16fb9068f086eae37f4a99023afb9baeafcf71b7149463267cb38ea70,1,1
0dcc041f5e3d43d36763ef55ea38104ac35905746853f9be2d26fad5fa9ff690,1,1 607f502961bf7128dd0582b9a571efa0cea3e963ac67a9e3b456f52bb53a3cb9,1,0
1076467ff06e3f96e51013aaf0a0e0bb42be9eb9556e8755dbe33039e914e1ac,1,0 8606079991b7a8abe0cd38e5769df5383235396f40c3358edab721d98003303c,1,2
618843bcc27fb901f5567543e15bd33ba82e7cb56d4d2fdb9a0e3249c18333a0,1,1 d00b4ab93cae7da54b7abf7279db292a21d52044adb0ac6827be60659fc7cd0d,1,0
08643b31590786fbab809614b208098849eab1f5ca59abd9a466c6f1963864d7,1,2 08a55e5e5fa0661ee79d3ecd316fd7cc99dc7d8ed1c93facebde6ee1cf1076cd,1,0
8c9ef06ae6e2033039b44e560cd7867c33855d86942d6c67c37ad1307aaa62dc,1,0 eb267ad1eeae88c9d7f7002fb2ecfa91ef34a3e821aa973cb96351260e5758a0,1,1
bef8e4003483bf2d338960dd86344b1c9305bac48eea84674170fab0d0383ece,1,0 03b9498cc22138daa719d5f4df3411328fba475d9b4ed555abc2f4d1421ef908,1,1
57dc6fb6f72783ac59970cfb4cffd11499fde2e0428caf7fb6e46ce80640ceea,1,0 70b5c750751a06fcd4a37fd218e6ec1bc9b333cc88b470834b5817d40503ec6e,1,1
8bc837ecb88f7b8ffe3a0719b654d6884d2d6b504d5c6449f33c995961f36ffc,1,0 6aa4e39368f7503a0ebbed7ed2d6ca319e4bc6d12850670521cc5ea39d3e9892,1,2
d6710d610c625e0474b666f6589a333826324d158e15168df29ebcd62e29fa84,1,2 9631860b028e749a622e45e75dcb0aba513e5132c84866c405817370cbc98e83,1,2
3abc24665caa0572b27a23c6b81a6c6e212ad38791130767482d9f9862c70430,1,2 088b8f12891abcf8a5a95315dd9055bd0f275a0ed4828e4438c739dd942ddf20,1,1
43275af6bf5204cdfe859b352f1eff99c8f53bf7dcadc1fdba023ea5fff6764a,1,1 cdbe7c3bfc8459eb7d30cd03a693904d6f77d02a41910fe4bcce07ac54128b3d,1,2
0150d4ca70f129c3ddaddebc6fc02e3ad91f782a61a9498ccab186724204d0f1,1,2 8fb91ad478af62f3315016314c0ca35cc79138ee0a77be4ca60932bfc8c925eb,1,2
f789ce7b5fde92573e0f92fb084aec2170bdf91ff9bd287179dd664552eb58af,1,1 5c994145e0457e4b27e17a1a4b91c3201febe4884427a6f97f565bb10cef1664,1,2
169c608db1421c3068506dddd682188a91a2c24311206a6116fb409ce35b22ba,1,1 00ed78a5e4367b0c00dede8fdd45b5f5560b82f42df04d2e731cd53b11ae0696,1,1
8b66146b305d8d5193e3291689a37de415ce53f17de1f6b209be7e4ec0dca29e,1,0 9848aceeb1374534725a30e69cb10cf85b6de125ffb1ab0bde623c074d5f4be4,1,2
617258fa0a85dcc9e8bdca9356d09be886c0c53a76e145710666234356b5f66d,1,2 e21d8b52aabe226501a62b3541c59c7387cbdd72896c4972dd207f2230bb40b0,1,2
e5ebc909e2194256073607bdca246bccfd03e26218f6d1e52fcdd769d482d8c4,1,0 4baf6fbc8dabc8f590d528a92a174c6ee601697321ce63ef6707c24e32a5aa26,1,2
4baf6fbc8dabc8f590d528a92a174c6ee601697321ce63ef6707c24e32a5aa26,1,1
19d91162f3c3f8bebc7093934a0feb2d0f4d49d68026f76d3e1852e74985e572,1,1 19d91162f3c3f8bebc7093934a0feb2d0f4d49d68026f76d3e1852e74985e572,1,1
d33034f6a11eb63a0442e86222a2378661e4303e88fde85d6111f2fc51a29564,1,2 d33034f6a11eb63a0442e86222a2378661e4303e88fde85d6111f2fc51a29564,1,2
11786b5dcb994ca4bf05084664b5e556dce29926194e0433a8fb4f9cc8873dc8,1,1 72902677753a71ee277fc2d38421063afe18d4326758edf5681861cce8ef3d61,1,1
79fb3a445bba7ad61da01e243489dbce8e09ee314922cf7f2891cbb265fcbab3,1,2 ef5383ba7f7d24472a20c86b417329c4000970718e2663b98eb8b234b8ad1c82,1,1
8602aa9075076a26db2a75408e4f370e260aae0a41493e4d3ff99cc46cdf6784,1,1 18e2a439b5f6230f88763fb27473ed47e2ff2defe58532e73b59f5a4d90021fd,1,0
8f93f1374818f9ec1fb75285c147df03eaba6710e2de487a9d60cd06e9ede16c,1,0 45aee4075e3bbd4cab4af22210214a42e563999ce20ffa9f0017d2b87fdefc99,1,0
d2b6c3c24ecfaab2a687a2edee0001cc7c9a57c33a25a5d8dbbbf2c104d23706,1,0 efc8893b0c467f8db7690c1808f4e5401d1523a444da95ef387b98cad9131668,1,0
156b3a5f2b222a3a31b91753ff9ae16fe9fbbf33dce078b6a51ef51e88562037,1,0 21b572cbf923782a7eef9993d2034c1f2bff4629ce4b7064dc792f4f46701bff,1,1
a2f416a37658b3d3fb838f415c127ba0a739365fe785060797e152cd86040723,1,0 c02db01c7f040be32a7bbf69f4b52290237631eb527b41e222379f58236f295f,1,0
048300ea0623eabe35d23cd9290a40ff29c2b102c22c91e64a8cba0fc50d8916,1,1 40ea2fdfc79e1f1eb0d850308f2d5bae5cfdff4384d64e4e168e29d6c6dcb7ed,1,1
ee31806df51c19ae7e837850bf8339082287f25e479b209e1aecee743d8d94ad,1,1 b4f43d72c79515268f144661fb32993138d174ff8d54892b45a6c7dc6e0a4226,1,1
b8566b549fca4fdfab517625d36cec6a88428a11eeb77d187a69537161267f57,1,1 bb47abbc0284f7f6b19b1f5fa8e9af87d2cf24770bb895d34727abcff90d85e6,1,0
8bbf648710d6cc3f10e76a3d9b7db707251dcd538df0024e84b243184e7b4c9b,1,2 e2d713a01cc9cba5bf722757a7cb6153ce6375baac52ee12e3e46a3b00915c4b,1,0
70219a29c0b25405bd19107b7c9b8d2b77ee537f5c634605555954431621fc10,1,2 25a4bdea8d4d42776a1d83da854dbd0430a34d6a4dcbee8eaf81279b15e12291,1,1
3c488fea2178ecd0a475bed56fbc37baccc8f4336cf4c149c9c6003a49fcb955,1,1 324ca091ea1357a2bed7c1697827f6602275eae504a10126deb0cdc92546d5fb,1,1
a42508e33f315f21fc78927721dc0543f9e873582d6869e7cb0cca1fb983601a,1,0 fb8cbfdaba8d8de6c9446aef9fdb768c3a78d026bb798574bdac2a80a5dc5733,1,2
023faf2b2c4b1b8840a30e71610aca8b5e6b2b026d769326856d69ec363b777a,1,2 4f9330b4a6897a4f6ad632da8d7117005fa1181ea456493d0c7101b0ae28de90,1,0
c40a610f6b980e560dbfb92d2e2d6fd060fcbfe683453fccc5df274db82ad179,1,2 b9561e05ff078b70b559e17de698900540df5bb55ec46d632462f3cda6823bb2,1,1
ad10300deb2174e6a879508df3709d7bc10c738e1dfea6d4dd25800d2f2799f0,1,2 1f7a113217ad1525cd04c2200135e45bed9b34f1375f7086ed780d9dba6cc595,1,2
7bafa3ee375e4d4129056b0e9ff446d13dc46eb042d0474ecfa5657185382f8a,1,2 e32d56c58727fc1f9848c38083255e21091a72c72f9c71653358d796cf17f272,1,2
4b649ba06bac0d0719ea386a61db7f06ecb01f3a384a85bbe2f68dc358cdf517,1,2 17e04c4bc48de0879c9e18c2d75b34222e4b77363fbd338d010f169351f41c9f,1,2
14f41c528811729138fa19cfad89ed5884e27e6ed71a6a6ecad90a3137ac848b,1,2 f80f806ece842e8db7866342077e4372c9151ad0630f9257a935bb9d71ab66dd,1,2
eaab18593191bf456eeda88f4346f1a254426b29886217fb13f622b8ddd6264e,1,1 11e9d8792583ad9beec9022050915ea0ec7797947571e28a9ae25f4c22babf68,1,2
e579302431fb2f8c0246f60761ca50ebf45225616b2ab3f3f4f45bf16f60c684,1,0 5627bd2c93cdd1b6ff225b20cca0d5cdb74a43488e7df89b936e98d71fc66294,1,0
da0fa4ba9aac87ff8e890226b6e190fba162d9b9bd2ee080b025edce5a31c491,1,0 26c1e8256e3def246128afd91d8cdff4b83d4257ba7db6ec7cb23b722de2c9d6,1,2
6d022fd46bebe5955c0ad3b84f3a3654241acb5a7b2afb4ddbad93a3c2e13b27,1,2 530176ac9cf80fa181b52f160f2e45090e22edfe73fcf81d43cdbbf0f9778fec,1,1
f374d4b0b77e1b9bdfceb4aef713c6c37b2d0f4955a0d5fb8bb6c38f9a73ba07,1,1 46f1e1aa0db4789221b5c99923be986ff36689ac15aaa27b85ba24b28f6fe199,1,1
481cbcc841e82700cffdd73f79e8b1123f50cd3e2d4f714a51104acbdbdf16dc,1,0 114dbe06457718d6a076ac635c4e8d55dffdd3f15f8ceb048198182d8efd7c1c,1,0
5ee7f2ca91e090880f310f8629a6c34fff908c331e795f0caf109ae3bce5bf0a,1,0 2f7beaa38367ab067f43d964a4cde00ac8f7661aa9e1cd46111344e6a784c951,1,2
ad66ec3399210b4ebbe4cde038299d8840a3f8b01810f06ad1a0aa78141e16e1,1,2 5ac5b0506e8e691723efba9dc9c9a15b652831863fe2bba24268233a05eafeec,1,2
358eb3ee0622c3646d83b83fb31e7f66aa1cc5fb78d3eee458fe609c803e7904,1,0 4dda7384be203140dbc49a076a7e6b76d9112675a3029df640448f2179e953be,1,2
c4d3926195913d2115ac84d5ddf1876260537bea52ef9383009c23d297650eeb,1,0 76aa5fc37a6628340dfb7f8b9a4c9d138d02155c1ea8abbd6225e23c927df840,1,2
1e3d864329059ae26b70bb2be137b7fb3d7890a890e0bd8613911ecb8c1e1c5d,1,1 d04380cc3dd2c3eb4ab705151f5d12eebf86585a9b867ef846fd5a1f1e6161f8,1,2
03c54f7c65b0615990aa04d98955d5eb42863fa5d7184f74e082373300f8954e,1,0 34df27f9c8f4f4db2175a33ffd0eb44788134fab1b002757192f84fa94454f57,1,0
89659c57abb82bd1960ed3c8a2731d3e98b8b63ea744be651e27fe36a317a1d8,1,0 1c13f34d3c4d4d3bbdca8e243905d5c9de5e4c1d98b272b222391cf1f13b7184,1,0
3f4ff83f93f94c610b07a07e2fc5466183faad8d52d962d19d1711a1f70bcd45,1,2 05e17ba0f827c14cd1120bc42f68673a73d187e62039cd3148e5ed015c162632,1,1
f1d7ec174edd91a90cca6507425db52ac351aac1c5472561f19721c1d53c68b5,1,0 c8a91589b448de06d3275b582f9e0d9716236f265b339f1705850cf157c410f9,1,0
cc9d8998f4aaa57d3ef73da47594add0829e0c21de9652a15d6274578914fdbb,1,0 eab88e86d7f334c2c02d7400189f6e080354d4cecaf507d0461e1e4d036bc0eb,1,0
d56fb1b375ad87f9551added4df92ea85c4c8c1f3cabe7e3a8317b99bcce826d,1,1 01d6756968fccc11ca43f9b36a50fc303ffb4cd6811bcdf13d09d6e1fce1eed3,1,1
61e38a58ec9dde20f2d48b15c35fc2ec9ad5c8bc51d9ca065808a89722200b4a,1,2 86256b8c5af7fb0832807a7737daa800b1e9a542ac4bbf3fa60087b652adc16b,1,1
fd4f97a90d04578248d77a84d77dc43c8c357b8e55cdb5b95dd5ccf14b5ac3cd,1,0 a2991c5df59cc7df0c47401fe9c0928b67bea9f5c04dc5479a63bbb309f7af23,1,2
af93aadac61203eb809136ff2378abe60de56ab573ace3af8ea983716a3f4397,1,2 90c5583036dfdc73b2fa0933b1168fa7ce4a14dffcfbce4f085d84f159c784b8,1,2
79abe5dd395de7eedacccdab4127e22905879f99ce5df43c695a876b34cc49d4,1,2 a6441fdc2e4b68955189f1a5d72e50f080db4841a089568c6c1347d7b05a1ce7,1,1
c2fd0663c2d64b39742a3ed9d984e337d3a14e9450ad38877c77b79e4e83cf29,1,0 d3e6cf58710e9e5bcffe67fd728d4e3f4055af46c92ec150af93788a2b56824c,1,1
ccaf2d9f46e8622e3f3b66f8c80419238b9e6f16e10c5ae09030873777ccea7b,1,2 d843400cce5fc05e84045b39a62c8ad7944a04bb36df2448af8791c203b6f690,1,2
df7d29329c93a454312f5408fe2c5ab6b0dcf512a663f9fef39015ac9de88f68,1,2 bf0e629445d89620ee41b1818aec01e6174a97ca3f9bde96c2acb6498e5efb0d,1,0
9be9ae508e33a83a5eaa9383aaacf59ea4d67dfbe54c93090fb39e86f929526d,1,0 a047c8aded8a034624c6f3f1246de829941019b6f28557417f70217dacb34da2,1,1
2b42f5a6a4d1ad221f072c2254daee4105a5f97ab7da27a6bdaec5910db56007,1,0 d9159efafd5d3af1ceaf724733480f914b241a5d260a47877ddc101a05c1fe67,1,1
f239ad271d7cdd8dbc4c1d66ea70bf6ca8c8e11e82523a10a5ea295ffe8caca2,1,1 08d7e6831bb79c67d8378a1afedd5e6082cca5f60243387279815436cad13f76,1,1
0ae4752edc800fdd50b7fe96914f78425578895709dec101fb5ba02865cf9b62,1,2 456bf5ab78d630f088fc7da2320c8b4aa4d29ce1edab299b2cf662d367bbb229,1,0
8191aada8ffbdd0393d16dc1613c0a64735be0b6250bcc5d36ea53cab950a23b,1,0 8a8550534e652ed1557847431efbdd442075375bfc4a79ff9548c5d99c03a415,1,2
4205ae398ecbc9e76c64e91682e0b27e898f0bfd9e2f6cbbb84b0a39e239b6a7,1,1 3c4adb4817f08f234dfa1eb3a803ca29af2e9c86d6cd18cf347275e67589d531,1,1
7f81bf69049f4412b69f7cdb2cc46d8daf690106c482d22c17d88322342870ab,1,1 cb94c03bfdd01224bd08519962c2fbf958a582a50dab4d3d537e301c101deb2f,1,0
eda27aeab1d13f8dcd71e9684c876458f924328f91df65bc3506abca0296032e,1,2 6f5cc260c8f8a527aead7ede796c8abb5880f5f717ca18c6d6b853672dd46e2c,1,2
cb79539ecfb462603e53fac86d347b2cfb50a16a2e0227f9d5629b2859efeba4,1,2
3455d7f22ad6a6f4d6cf890b92226d44d6a5c2dd87d2468c77c0fbdad55abb7e,1,0
a642af56622bd85d525a71c1f367b701c82579f0292fc93a291e64f41c9a4ada,1,1
c20ab71635981f0ad33243bb4e789ded41db1fc59b66f792aec3fe372f3ad338,1,0
43bc377555abada0ede53af6cc472d4f0823c5492aa776740367e6234f644b27,1,2
0,1,2 0,1,1
1,1,1 1,1,1
2,1,0 2,1,1
3,1,2 3,1,1
4,1,1 4,1,0
5,1,1 5,1,1
6,1,1 6,1,0
7,1,1 7,1,0
8,1,0 8,1,0
9,1,2 9,1,2
10,1,2 10,1,0
11,1,1 11,1,1
12,1,2 12,1,0
13,1,1 13,1,0
14,1,0 14,1,1
15,1,0 15,1,2
16,1,1 16,1,0
17,1,2 17,1,0
18,1,2 18,1,2
19,1,0 19,1,2
20,1,0 20,1,0
21,1,1 21,1,0
22,1,2 22,1,2
23,1,2 23,1,1
24,1,2 24,1,2
25,1,0 25,1,2
26,1,1 26,1,2
27,1,2 27,1,1
28,1,1 28,1,1
29,1,0 29,1,1
30,1,2 30,1,0
31,1,1 31,1,0
32,1,0 32,1,0
33,1,2 33,1,2
34,1,1 34,1,1
35,1,0 35,1,0
36,1,1 36,1,2
37,1,0 37,1,0
38,1,1 38,1,1
39,1,0 39,1,0
40,1,0 40,1,1
41,1,1 41,1,0
42,1,1 42,1,2
43,1,0 43,1,2
44,1,2 44,1,0
45,1,2 45,1,0
46,1,1 46,1,1
47,1,1 47,1,1
48,1,0 48,1,0
49,1,0 49,1,0
50,1,0 50,1,1
51,1,1 51,1,1
52,1,1 52,1,0
53,1,0 53,1,1
54,1,2 54,1,2
55,1,2 55,1,1
56,1,1 56,1,1
57,1,0 57,1,2
58,1,1 58,1,1
59,1,1 59,1,0
60,1,2 60,1,2
61,1,0 61,1,2
62,1,2 62,1,0
63,1,2 63,1,1
0,1,0 0,1,2
1,1,2 1,1,1
2,1,2 2,1,2
3,1,1 3,1,1
4,1,0 4,1,1
5,1,2 5,1,0
6,1,2 6,1,2
7,1,2 7,1,2
8,1,0 8,1,0
9,1,0 9,1,0
10,1,2 10,1,0
11,1,0 11,1,1
12,1,2 12,1,0
13,1,1 13,1,0
14,1,1 14,1,2
15,1,1 15,1,2
16,1,0 16,1,2
17,1,2 17,1,1
18,1,0 18,1,1
19,1,1 19,1,1
20,1,0 20,1,0
21,1,1 21,1,1
22,1,1 22,1,0
23,1,0 23,1,0
24,1,1 24,1,0
25,1,0 25,1,0
26,1,2 26,1,1
27,1,2 27,1,2
28,1,2 28,1,1
29,1,1 29,1,2
30,1,1 30,1,1
31,1,0 31,1,1
32,1,0 32,1,1
33,1,0 33,1,0
34,1,0 34,1,2
35,1,1 35,1,1
Source diff could not be displayed: it is too large. Options to address this: view the blob.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment