Hier liegt der unnötige Knackpunkt:
1  |       TEMP_IN := CIN & BI & AI; 
  | 
2  |       case TEMP_IN is ...
  | 
Wenn du hier Signale hättest, müsstest du schreiben
1  |       TEMP_IN <= CIN & BI & AI; 
  | 
2  |       case TEMP_IN is ...
  | 
und TEMP_IN in dei Sensitivliste aufnehmen.
Insgesamt ist das Beispiel so unnötig kompliziert an den Haaren durch 
die Brust gezogen...  :-/
BTW:
Ein "normaler" Mensch würde TEMP_IN weglassen und schreiben:
1  |       case CIN & BI & AI is ...
  | 
Oder gleich so:
1  |   P1: process(CIN, BI, AI) 
  | 
2  |     begin 
  | 
3  |       case CIN & BI & AI is 
  | 
4  |          when "000" =>  COUT <= '0'; SI <= '0'; 
  | 
5  |          when "011" =>  COUT <= '1'; SI <= '0'; 
  | 
6  |          when "101" =>  COUT <= '1'; SI <= '0';  
  | 
7  |          when "110" =>  COUT <= '1'; SI <= '0';  
  | 
8  |          when "111" =>  COUT <= '1'; SI <= '1';  
  | 
9  |          when others => COUT <= '0'; SI <= '1'; 
  | 
10  |       end case; 
  | 
11  |     end process P1;
  | 
Da sehe ich gleich, wie Carry und Sum sich verhalten.
Das scheint mir sogar noch besser lesbar ;-)