지난번에
https://gall.dcinside.com/mgallery/board/view/?id=factorio&no=55856&exception_mode=recommend&page=1
여기서 작품 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를 출력하는데 입출력 방식은 내가 만들어놓은 필터 말고도 사용자가 필터를 어떻게 구성하느냐에 따라 맘대로 설정할 수 있음.
그냥 생각나는데로 만들어서 비효율적이고 엉성하지만 그래도 누군가는 유용하게 썼으면 좋겟다
시연
뭔가 뭔가 일어나고 있으니 일단 개추
회로질 하다보니 조합기 세로로 놓는게 더 깔끔하더라 - dc App
그러게 그 생각을 못했네
picker dollie combinator toggle wire shortcut 제대로 할거면 이것도 깔아바 - dc App
ㄱㅅ
참고로 매 틱 마다 적절한 k 값 넣으면 순서대로 잘 들어감. 저장되는데 4틱 딜레이만 생길 뿐
읽기는 몇틱딜레이임?
1틱
인데 값넣은다음에 읽으려면 5틱은 걸리지 않을까