# Case 1.

read_verilog << EOT

module top(...);

input clk;
input sel;
input [3:0] ra;
input [3:0] wa;
input wd;
output [3:0] rd;

reg [3:0] mem[0:15];

integer i;
initial begin
        for (i = 0; i < 16; i = i + 1)
                mem[i] <= i;
end

assign rd = mem[ra];

always @(posedge clk) begin
        mem[wa] <= {4{sel ? wd : mem[wa][0]}};
end

endmodule

EOT

hierarchy -auto-top
proc
opt_clean

design -save start
memory_map
design -save preopt

design -load start
opt_mem_feedback
memory_map
design -save postopt

equiv_opt -assert -run prepare: :



design -reset

# Case 2.

read_verilog << EOT

module top(...);

input clk;
input s1;
input s2;
input s3;
input [3:0] ra;
input [3:0] wa;
input wd;
output rd;

reg mem[0:15];

integer i;
initial begin
        for (i = 0; i < 16; i = i + 1)
                mem[i] <= ^i;
end

assign rd = mem[ra];

wire ta = s1 ? wd : mem[wa];
wire tb = s2 ? wd : ta;
wire tc = s3 ? tb : ta;

always @(posedge clk) begin
        mem[wa] <= tc;
end

endmodule

EOT

hierarchy -auto-top
proc
opt_clean

design -save start
memory_map
design -save preopt

design -load start
opt_mem_feedback
memory_map
design -save postopt

equiv_opt -assert -run prepare: :