문제

  • READ VALUES FROM IN.A AND IN.B
  • WRITE IN.A - IN.B TO OUT.P
  • WRITE IN.B - IN.A TO OUT.N
  • IN.AIN.B로 들어오는 값들을 읽는다.
  • IN.A - IN.B를 계산해서 OUT.P로 내보낸다.
  • IN.B - IN.A를 계산해서 OUT.N로 내보낸다.

image

풀이 1

  • 201 CYCLES / 5 NODES / 11 INSTR

A - BB - A의 절대값이 같다는 특징을 활용한다.

  • IN.A 입력 노드는 값을 입력 받으면 바로 IN.B 입력 노드로 전달한다.
  • IN.B 입력 노드는 입력 값을 받아 ACC에 저장한다.
    • ACC에서 IN.A에서 전달받은 값을 빼고, 아래 노드로 전달한다.
  • OUT.N 출력 노드는 전달받은 값을 ACC에 저장한다.
    • ACC 값을 OUT.P 출력 노드로 전달한다.
    • OUT.N 출력 노드는 ACC의 값을 내보낸다.
  • OUT.P 출력 노드는 전달받은 값을 ACC로 저장한다.
    • NEG 명령을 사용해 ACC 값의 부호를 뒤집는다.
    • ACC 값을 내보낸다.

image

save/20176.1.txt

@0
#201 CYCLES
#  5 NODES
# 11 INSTR

@1
MOV UP, RIGHT

@2
MOV UP, ACC
SUB LEFT
MOV ACC, DOWN #B-A

@3


@4


@5


@6
MOV UP, DOWN

@7


@8
MOV RIGHT, ACC
NEG
MOV ACC, DOWN

@9
MOV UP, ACC
MOV ACC, LEFT
MOV ACC, DOWN

@10

풀이 2

  • 240 CYCLES / 5 NODES / 10 INSTR

풀이 1보다 더 많은 사이클을 돌지만 1개의 명령을 줄인 방법이다.

풀이 1과 같은 논리를 사용하지만, 풀이 1과 2는 다음과 같은 차이가 있다.

  • 풀이 1
    • OUT.N에서 B - A의 값을 계산하고 내보냄.
    • OUT.P에서는 -1 * (B - A)의 값을 계산해 내보냄.
  • 풀이 2
    • OUT.N에서 B - A의 값을 계산하고 내보냄.
    • OUT.N에서는 -1 * (B - A)의 값을 계산해 OUT.P 노드로 전달함.
    • OUT.P에서는 전달받은 값을 그대로 내보냄.

역할이 나뉘어있는 풀이 1이 더 적은 사이클을 사용한다(더 빠르다).

풀이 1은 더 적은 수의 명령을 사용하고 있을 뿐이다.

image

save/20176.2.txt

@0
#240 CYCLES
#  5 NODES
# 10 INSTR

@1
MOV UP, RIGHT

@2
MOV LEFT, ACC
SUB UP #A-B
MOV ACC, DOWN

@3


@4


@5


@6
MOV UP, DOWN #A-B

@7


@8
MOV RIGHT, DOWN

@9
MOV UP, ACC
MOV ACC, LEFT #B-A
NEG
MOV ACC, DOWN

@10