지난번에

https://gall.dcinside.com/mgallery/board/view/?id=factorio&no=55856&exception_mode=recommend&page=1

[회로 대회] Lookup table 구현하기 수상식참가자가 그래도 5명은 되지 않을까 기대했지만 3명밖에 없었다고 한다.. 참가해준 사람들의 회로 해설 및 코멘트 진행합니다내 회로도 몇개 들어가있음 작품1https://factoriobin.com/post/49zvgall.dcinside.com


여기서 작품 2 낸 팩붕이 인데 그때 작품 만들다가 능동적으로 읽기쓰게 만들 수 있을 것 같다고 생각했다가 까먹고 이제 생각나서 만들어봤음





생명주기
1. 먼저 key와 value 값을 왼쪽 위 전신주에 초록선으로 넣어줌
key는 무조건 k 인데 value는 회로에 사용되는 D, Z, O, R과 검색필터에 사용되는 X 제외하고 아무렇게나 넣을 수 있음(ex. K1(키값), V25, F31, G12 이렇게 넣어도 됨)

2. 이렇게 넣은 k, v 값으로 전처리를 하는데 3번 회로에 들어가는 모든 값이 2이여야만 함.
7번회로를 보면 D, Z, O값을 3번 회로에 넣어주는 것을 볼 수 있는데

D는 1, 4번 회로가 담당하고 지금 들어오는 k값이 이전에 들어온 k값과 다르면 D1을 출력함. t(현재틱) 마다 무조건 t-1 과 다른값이 들어온다는 것을 보장함. 솔직히 O 있으면 필요 없는 것 같은데 확신은 못함

Z 는 2번 회로가 담당하고 K가 0이 아니라는 걸 보장함. K가 0이어야 하는 이유는 메모리셀 처음 설치할 때 신호 없으니 k=0이라서
이것도 O 있으면 필요 없는 것 같은데 마찬가지로 확신은 못함

O는 5, 9번 회로가 담당하고 중복 키값이 없다는 것을 보장함. 1이 출력되어야 1+1=2가 되어 통과되는 D, Z 와 다르게 이건 통과되면 안되므로 1이 출력되면 3번회로에서 2+1=3 이 되어 통과되지 않음

D, Z가 6번회로(1틱 지연)을 거치는 이유는 O와 타이밍을 맞추기 위함

3. 이렇게 전처리 거치면 3번회로를 통과한 R과 함께 8번 3틱버퍼를 통과한 k, v 가 10, 11, 12로 들어감 t에서 12에 먼저 R이 들어가 메모리셀을 초기화 하고 t+1에 10, 11에서 출력된 k, v가 1틱 동안만 12에 들어감 1틱만 값이 들어가기 때문에 기존 메모리셀에 신호 줄 때 처럼 값이 끊임없이 올라가지 않음. 12가 입력받은 k, v 를 그대로 출력하면 저장이 완료됨.

만약 메모리블럭이 여러개 있는 상태라면 R이 들어 올 때 마다 다음 메모리블럭으로 k, v를 전달함
만약 마지막 메모리블럭에 R이 들어오면 값은 증발함
(Queue 자료구조에 Push와 Pop이 동시에 일어난다고 생각하면 됨)

12에 k, v가 저장되면 생명주기 완료

13번 검색필터는 입력받은 X와 12번의 k가 일치하면 v를 출력하는데 입출력 방식은 내가 만들어놓은 필터 말고도 사용자가 필터를 어떻게 구성하느냐에 따라 맘대로 설정할 수 있음.


보라색 표시한 전신주에 초록색 전선으로 R2값 넣으면 모든 메모리 블럭을 초기화할 수 있음

그냥 생각나는데로 만들어서 비효율적이고 엉성하지만 그래도 누군가는 유용하게 썼으면 좋겟다
시연