mirror of
https://github.com/YosysHQ/sby.git
synced 2025-04-12 16:28:17 +00:00
Merge pull request #86 from mattvenn/master
make wolf goat cabbage puzzle gender neutral
This commit is contained in:
commit
3c14d12180
|
@ -1,38 +1,38 @@
|
||||||
// A man needs to cross a river with a wolf, a goat and a cabbage. His boat is only large
|
// A person needs to cross a river with a wolf, a goat and a cabbage. Their boat is only large
|
||||||
// enough to carry himself and one of his three possessions, so he must transport these
|
// enough to carry themselves and one of their three possessions, so they must transport these
|
||||||
// items one at a time. However, if he leaves the wolf and the goat together unattended,
|
// items one at a time. However, if they leave the wolf and the goat together unattended,
|
||||||
// then the wolf will eat the goat; similarly, if he leaves the goat and the cabbage together
|
// then the wolf will eat the goat; similarly, if they leave the goat and the cabbage together
|
||||||
// unattended, then the goat will eat the cabbage. How can the man get across safely with
|
// unattended, then the goat will eat the cabbage. How can the person get across safely with
|
||||||
// his three items?
|
// their three items?
|
||||||
|
|
||||||
module wolf_goat_cabbage (input clk, input w, g, c);
|
module wolf_goat_cabbage (input clk, input w, g, c);
|
||||||
// everyone starts at the 1st river bank
|
// everyone starts at the 1st river bank
|
||||||
reg bank_w = 0; // wolf
|
reg bank_w = 0; // wolf
|
||||||
reg bank_g = 0; // goat
|
reg bank_g = 0; // goat
|
||||||
reg bank_c = 0; // cabbage
|
reg bank_c = 0; // cabbage
|
||||||
reg bank_m = 0; // man
|
reg bank_p = 0; // person who drives the boat
|
||||||
|
|
||||||
always @(posedge clk) begin
|
always @(posedge clk) begin
|
||||||
|
// person travels and takes the selected item with him
|
||||||
|
bank_p <= !bank_p;
|
||||||
|
if (w && (bank_w == bank_p)) bank_w <= !bank_p;
|
||||||
|
if (g && (bank_g == bank_p)) bank_g <= !bank_p;
|
||||||
|
if (c && (bank_c == bank_p)) bank_c <= !bank_p;
|
||||||
|
|
||||||
// maximum one of the control signals must be high
|
// maximum one of the control signals must be high
|
||||||
assume (w+g+c <= 1);
|
assume (w+g+c <= 1);
|
||||||
|
|
||||||
// we want wolf, goat, and cabbage on the 2nd river bank
|
// we want wolf, goat, and cabbage on the 2nd river bank
|
||||||
cover (bank_w && bank_g && bank_c);
|
cover(bank_w == 1 && bank_g == 1 && bank_c == 1);
|
||||||
|
|
||||||
// don't leave wolf and goat unattended
|
// don't leave wolf and goat unattended
|
||||||
if (bank_w != bank_m) begin
|
if (bank_w != bank_p) begin
|
||||||
assume (bank_w != bank_g);
|
assume (bank_w != bank_g);
|
||||||
end
|
end
|
||||||
|
|
||||||
// don't leave goat and cabbage unattended
|
// don't leave goat and cabbage unattended
|
||||||
if (bank_g != bank_m) begin
|
if (bank_g != bank_p) begin
|
||||||
assume (bank_g != bank_c);
|
assume (bank_g != bank_c);
|
||||||
end
|
end
|
||||||
|
|
||||||
// man travels and takes the selected item with him
|
|
||||||
if (w && (bank_w == bank_m)) bank_w <= !bank_m;
|
|
||||||
if (g && (bank_g == bank_m)) bank_g <= !bank_m;
|
|
||||||
if (c && (bank_c == bank_m)) bank_c <= !bank_m;
|
|
||||||
bank_m <= !bank_m;
|
|
||||||
end
|
end
|
||||||
endmodule
|
endmodule
|
||||||
|
|
Loading…
Reference in a new issue