-- Flop with Sync set/reset.
  process (clk)
  begin
    if (rising_edge(clk)) then
      if (rst1 = '0') then
        out1 <= '0';
      elsif (rst2 = '1') then
        out1 <= '1';
      else
        out1 <= in1;
      end if;
    end if;
  end process;

-- Flop with multi Sync reset.
process (clk)
  begin
    if (rising_edge(clk)) then
      if (rst1 = '0') then
        out2 <= '0';
      elsif (rst2 = '1') then
        out2 <= '0';
      else
        out2 <= in2;
      end if;
    end if;
  end process;

-- Flop with Async set/reset
  process (clk, rst1, rst2)
  begin
    if (rst1 = '0') then
        out1 <= '0';
    else
      if (rst2 = '1') then
        out1 <= '1';
      else
        if (rising_edge(clk)) then
          out1 <= in1;
        end if;
      end if;
    end if;
  end process;

-- Flop with multi Async reset
process (clk, rst1, rst2)
  begin
    if (rst1 = '0') then
        out2 <= '0';
    else
      if (rst2 = '1') then
        out2 <= '0';
      else
        if (rising_edge(clk)) then
          out2 <= in2;
        end if;
      end if;
    end if;
  end process;

-- Latch with Async set/reset
  process (clk, rst1, rst2)
  begin
    if(rst1 = '0') then
      out1 <= '0';
    elsif(rst2 = '1') then
      out1 <= '1';
    elsif (clk = '1') then
      out1 <= in1;
    end if;
  end process;

-- Latch with multi Async reset
  process (clk, rst1, rst2)
  begin
    if (rst1 = '0' or rst2 = '1') then
      out2 <= '0';
    elsif (clk = '1') then
      out2 <= in2;
    end if;
  end process;

-- Flop with Sync reset
  process (clk)
  begin
    if (rising_edge(clk)) then
      if (rst = '0') then
        out2 <= '0';
      else 
        out2 <= in1;
      end if;
    end if;
  end process;