library IEEE; use IEEE.std_logic_1164.all; use work.TTTdefs.all; entity TwoInRow is port ( X, Y: in TTTgrid; MOVE: out TTTmove ); end TwoInRow; architecture TwoInRow_arch of TwoInRow is function R(X, Y: TTTgrid; i, j: INTEGER) return BOOLEAN is variable result: BOOLEAN; begin -- Find 2-in-row with empty cell i,j result := TRUE; for jj in 1 to 3 loop if jj = j then result := result and X(i)(jj)='0' and Y(i)(jj)='0'; else result := result and X(i)(jj)='1'; end if; end loop; return result; end R; function C(X, Y: TTTgrid; i, j: INTEGER) return BOOLEAN is variable result: BOOLEAN; begin -- Find 2-in-column with empty cell i,j result := TRUE; for ii in 1 to 3 loop if ii = i then result := result and X(ii)(j)='0' and Y(ii)(j)='0'; else result := result and X(ii)(j)='1'; end if; end loop; return result; end C; function D(X, Y: TTTgrid; i, j: INTEGER) return BOOLEAN is variable result: BOOLEAN; -- Find 2-in-diagonal with empty cell i,j. begin -- This is for 11, 22, 33 diagonal. result := TRUE; for ii in 1 to 3 loop if ii = i then result := result and X(ii)(ii)='0' and Y(ii)(ii)='0'; else result := result and X(ii)(ii)='1'; end if; end loop; return result; end D; function E(X, Y: TTTgrid; i, j: INTEGER) return BOOLEAN is variable result: BOOLEAN; -- Find 2-in-diagonal with empty cell i,j. begin -- This is for 13, 22, 31 diagonal. result := TRUE; for ii in 1 to 3 loop if ii = i then result := result and X(ii)(4-ii)='0' and Y(ii)(4-ii)='0'; else result := result and X(ii)(4-ii)='1'; end if; end loop; return result; end E; begin process (X, Y) variable G11, G12, G13, G21, G22, G23, G31, G32, G33: BOOLEAN; begin G11 := R(X,Y,1,1) or C(X,Y,1,1) or D(X,Y,1,1); G12 := R(X,Y,1,2) or C(X,Y,1,2); G13 := R(X,Y,1,3) or C(X,Y,1,3) or E(X,Y,1,3); G21 := R(X,Y,2,1) or C(X,Y,2,1); G22 := R(X,Y,2,2) or C(X,Y,2,2) or D(X,Y,2,2) or E(X,Y,2,2); G23 := R(X,Y,2,3) or C(X,Y,2,3); G31 := R(X,Y,3,1) or C(X,Y,3,1) or E(X,Y,3,1); G32 := R(X,Y,3,2) or C(X,Y,3,2); G33 := R(X,Y,3,3) or C(X,Y,3,3) or D(X,Y,3,3); if G11 then MOVE <= MOVE11; elsif G12 then MOVE <= MOVE12; elsif G13 then MOVE <= MOVE13; elsif G21 then MOVE <= MOVE21; elsif G22 then MOVE <= MOVE22; elsif G23 then MOVE <= MOVE23; elsif G31 then MOVE <= MOVE31; elsif G32 then MOVE <= MOVE32; elsif G33 then MOVE <= MOVE33; else MOVE <= NONE; end if; end process; end TwoInRow_arch;