Embora o cálculo interno de todas as respostas e o uso de um mux para selecionar entre elas funcionem, certamente não é um projeto mínimo.
Considere que você pode dividir o problema em bits; em vez de um único bloco de lógica com duas entradas de 8 bits, você pode particionar isso como duas seções de 4 bits, desde que possa vinculá-las para obter um resultado geral correto. Felizmente, vincular as fatias não é pior do que um único bit, que no caso de adição representa o bit de transporte. Portanto, cada fatia de 4 bits tem uma entrada e uma saída. (Observe que lógicas como AND e NOR nem precisarão disso, embora, se mais tarde você implementar turnos para a esquerda / direita, esse bit será reutilizado facilmente).
Levado ao extremo, você pode usar 8 fatias de 1 bit cada. É útil pensar nas fatias de 1 bit, porque facilita a reflexão sobre uma abordagem que aumenta de volta para fatias maiores. Portanto, com uma fatia de 1 bit, você tem apenas 7 entradas: o código de função de 4 bits, um pouco da entrada A, um pouco da entrada B e um bit de transporte. Você também tem apenas duas saídas: funcionar e executar. Portanto, agora você pode escrever as duas funções de saída em termos de apenas 7 entradas, que estão dentro do domínio da capacidade humana de reduzir razoavelmente. Você terminará com um punhado de portas que nem sempre necessariamente computarão todas as funções, mas não importa o que acontece dentro da fatia, apenas que produz o resultado correto quando visto de fora.
Agora você pode seguir algumas maneiras. Uma maneira é simplesmente usar 8 dessas fatias de 1 bit e pronto. Outra maneira é fazer fatias maiores e depois usá-las. Passando de 1 para 2 bits, as equações vão de 7 entradas para 9, e 4 bits exigirão funções de 13 entradas. Não é necessariamente fácil, mas fornecerá resultados mais compactos do que a abordagem computar tudo depois mux. Além disso, se você olhar para as partes internas de uma fatia ALU 74181 de 4 bits, não verá um mux lá.