(이 글은 2021년 8월 30일에 업로드한 'Double Dabble 알고리즘'과 이어집니다.)
SchBoard는 작년(2021년) 8-9월에 개발한 디지털 논리회로 시뮬레이션 프로그램이다.
Ben Eater 채널의 영상을 보고, 나도 브레드보드 위에 컴퓨터를 만들어보는 것이 좋겠다고 생각했다. (브레드보드 위에 컴퓨터를 구현하는 영상들의 재생목록이다. 심심하면 봐보는 것도 나쁘지 않다.) 하지만 실질적으로 브레드보드를 구매하고 반도체 소자를 구매하는 데에는 물리적·시간적 제약이 크게 들었기 때문에 마인크래프트를 사용해 컴퓨터를 구현했으나, 이 역시 마인크래프트 내 기계장치의 공간활용적 제약에 의해 쉽게 진행되지 않았다. 로지심과 같은 기존에 만들어져있는 시뮬레이션 프로그램을 사용하려고도 해보았으나, 이러한 프로그램에는 이미 모든 소자가 구현되어있기 때문에 소자를 추상화해가며 컴퓨터를 구현하는 경험을 쌓을 수 없었다.
따라서 나는 프로그램을 직접 만들어보기로 했다. 내가 만드는 브레드보드 프로그램이었기 때문에 SchBoard라고 이름지었다.
개발 첫 날에는 기본적인 프로그램 레이아웃과 간단한 매커니즘을 구현했다.
개발 둘째 날에는 요소의 추상화(!)를 구현했다. 추상화는 SchBoard의 가장 중요한 기능이다.
SchBoard의 추상화는, 현재 화면에 나타나는 요소들을 모두 하나의 요소로 묶는 역할을 수행한다. 이를테면, 화면에 서로 독립적인 OR 게이트 요소 2개가 놓여있고 각각 게이트의 소켓(와이어 연결 부분)에 아무런 와이어도 연결되어이지 않다고 하자. OR 게이트에는 각각 2개의 입력 소켓이 있고 1개의 입력 소켓이 있고, 그러한 OR 게이트 요소가 2개 있기 때문에, 화면에 있는 요소들을 추상화하면 입력 소켓이 4개, 출력 소켓이 2개가 있는, 하나의 요소가 만들어지게 된다.
입력 소켓의 앞쪽 두 개와 출력 소켓의 뒤쪽 한 개, 뒤쪽 두 개와 뒤쪽 한 개는 각각의 OR 게이트의 소켓을 가리키는 포인터로, 사실장 기존의 소켓들과 같은 것이므로 기존의 장치와 동일하게 작동하도록 의도했다.
개발 셋째 날에는 크나큰 일이 있었다...
기존의 추상화 방식은 단지 화면에 있는 요소들을 하나의 리스트로 묶어주는 역할을 하고, 그 요소를 새로 생성했을 때에 새로운 와이어와 요소들을 담은 리스트를 포함한 새로운 요소를 새로 만드는 작업을 프로그램 내부적으로 수행하도록 의도했었다.
하지만 이 방식의 허점은, 플립 플롭과 같이 최초의 상태가 이론적으로 정해지지 않는 회로에서 발생했다. 이 프로그램에서 계산은 프레임레이트를 가지기 때문에, 한 프레임 당 하나의 와이어와 하나의 소켓이 업데이트 되고, 그것에 연결된 다음 연산이 진행되는 방식으로 기계를 구현하게 했다.
하지만 플립 플롭같은 경우에는 입력 소켓 둘 중 하나에 NOT 게이트의 출력이 실제로 면저 도달하는 쪽이 처음 값을 정하게 되고 그러한 상태가 계속 지속되는 회로들로 이루어져 있는데, SchBoard에서는 대칭인 구조에서 시간 차이가 발생하지 않기 때문에 언제나 동시에 입력 값으로 NOT 게이트의 출력이 도달하게 되므로 펄스가 일어나게 되었다.
결국 와이어의 상태와 소켓의 상태를 포함하도록 추상화 된 요소의 구조를 다시 디자인해야 했고, 이것을 구현하는 데에 많은 시간이 걸렸다.
결국 그러한 새로운 추상화의 구현을 성공해내어 성공적으로 레지스터를 구현할 수 있게 되었고, 위 영상에서와 같이 펄스마다 피보나치 수열을 계산하는 기계를 만들 수 있게 되었다.
개발 넷째 날에는 사용자 입력을 더욱 쉽게 하기 위해 "스위치" 요소를 추가했다.
"스위치" 요소는 켜져있거나 꺼져있는 상태에서 사용자가 한 번 클릭했다가 떼는 때에 자신의 켜짐 상태를 반전하는 역할을 수행하고, 자신의 켜짐 상태를 반환하는 하나의 소켓만을 가지는 요소이다.
이것을 통해서 이론적으로 모든 회로를 구현할 수 있는 프로그램을 제작하게 되었다!!
지금은 2022년 3월이 되어서 SchBoard를 개발한 지도 반년이 넘어가지만, 아직까지 SchBoard에는 구현되어야 한다고 생각하는 여러가지 기능들이 있다. SchBoard는 개인적으로 내가 가장 자랑스럽게 생각하는 프로그래밍 프로젝트이기 때문에, 언젠가 그러한 기능들을 모두 만들어보고 싶다.
내가 만들고 싶은 SchBoard의 기능은 지금 당장 다음과 같다.