mirror of
https://github.com/YosysHQ/sby.git
synced 2025-04-14 01:08:43 +00:00
45 lines
1 KiB
Systemverilog
45 lines
1 KiB
Systemverilog
// You are given an 8 litre bucket of water, and two empty buckets which can
|
|
// contain 5 and 3 litre respectively. You are required to divide the water into
|
|
// two by pouring water between buckets (that is, to end up with 4 litre in the 8
|
|
// litre bucket, and 4 litre in the 5 litre bucket).
|
|
//
|
|
// Inspired by:
|
|
// https://github.com/DennisYurichev/random_notes/blob/master/Z3/pour.py
|
|
|
|
module pour_853_to_4 (
|
|
input clk,
|
|
input [1:0] src, dst
|
|
);
|
|
reg [3:0] state [0:2];
|
|
reg [3:0] max_amount [0:2];
|
|
reg [3:0] xfer_amount;
|
|
|
|
initial begin
|
|
state[0] = 8;
|
|
state[1] = 0;
|
|
state[2] = 0;
|
|
|
|
max_amount[0] = 8;
|
|
max_amount[1] = 5;
|
|
max_amount[2] = 3;
|
|
end
|
|
|
|
always @* begin
|
|
assume (src < 3);
|
|
assume (dst < 3);
|
|
assume (src != dst);
|
|
|
|
if (state[src] > (max_amount[dst] - state[dst]))
|
|
xfer_amount = max_amount[dst] - state[dst];
|
|
else
|
|
xfer_amount = state[src];
|
|
|
|
cover (state[0] == 4 && state[1] == 4);
|
|
end
|
|
|
|
always @(posedge clk) begin
|
|
state[src] <= state[src] - xfer_amount;
|
|
state[dst] <= state[dst] + xfer_amount;
|
|
end
|
|
endmodule
|