VLSI CAD: Logic to Layout Lecture 011 BDD Ordering

그래서, 우리는 강의 34에 있습니다

우리는 우리의 탐험을 완료 할 것입니다 이진 의사 결정 다이어그램은 다음에 대한 매우 강력하고 중요한 데이터 구조입니다 전산 부울 대수학 그리고 지금까지 우리는 어떻게 우리가 공유 된 집합을 사용하여 복잡한 부울 함수 집합을 나타낼 수 있습니다 BDD 노드 그리고 인생은 정말로 정말로 좋았습니다

우리가이 강의에서 보여줄대로, 여러분은 매우 디지털 논리의 두 가지 복잡한 조각과 같은 복잡한 질문 동일합니다 그들이 어떻게 다른지 복잡한 부울 함수를 1로 만들 수있는 입력을 찾을 수 있습니까? 우리는 정말로 훌륭하고, 겉으로는 간단한 방법으로 대답 할 것입니다 그 질문들 그래서, 멋진 일이라면, 캐치가 있어야 해, 그렇지? 그리고 문제는 변수들은 실제로 BDD를 만드는 우리의 능력에 중대한 영향을 미친다

모든 부울 기능이 관리 가능한 크기의 BBD로 바뀔 수있는 것은 아닙니다 그리고 변수의 순서에 따라 BDD는 작고 친숙합니다 BDD 변수의 일부 순서에 대해 BDD는 지수 함수이며 끔찍한 때로는 해결할 수 있습니다 때때로 우리는 할 수 없습니다

그것은 인생이 여기서 일하는 방식 일뿐입니다 그래서 BDD에서 순서가 어떻게 삶에 영향을 주는지 살펴 보겠습니다 이제 BDD가 실제로 구현되는 방법에 대해 조금 이야기하겠습니다 BDD 개발을 시작할 때 제가 말한 것들 중 하나는 솔직히 내가 그런 식으로 구현할 수는 없어 개념적으로 소개 한 것 같은데

즉, 전체 의사 결정 다이어그램을 2와 같이 평평하게 만들 수는 없습니다 100 개의 변수의 함수에 대한 하단의 리프 노드에서 100 감축을 적용하십시오 더 좋은 방법이 있어야하고 거기에 더 좋은 방법입니다 그리고 우리는 아주 간단한 이야기를 할 것입니다 이 강의에서이 더 나은 방법에 대해 높은 수준으로 강의합니다

BDD가 실제로 구현되는 방법은 재귀 적 방법입니다 그리고 그것은이 수업에서 반복되는 테마의 일종이 될 것입니다 있잖아, 네가 나 한테 묻는다면, 그건 정말 복잡한 CAD 문제 야, 롭 우리가 어떻게 그것을 해결할 것이라고 생각합니까? 그 대답은 나도 몰라 우리는 그것을 두 조각으로 나눌 수 있을까요? 그들을 재귀 적으로 풀어서 풀을 붙입니다

다시 답을하고 대답은 아마도 10 번 중 9 번이 예가 될 것입니다 따라서 BDD의 경우에도 속임수가 있습니다 Shannon의 공동 인수 나누기와 종류의 것들을 정복하십시오 그리고 여기서 큰 아이디어는 BBD 패키지가 실제로 기능적으로 연산자 집합으로 구현되면 그들은 BDD에서 작업합니다 그래서, 당신은 당신이 원하는 모든 것을 얻습니다

상상해보십시오, 말하자면, 문은, 당신도 알다시피, 당신은 얻을 수 있습니다 배타적이거나 배타적 인 것도 아닙니다 당신은 섀넌 (Shannon) 너는 알고있다, 공동 인자 또는 가변, 또는 밖으로 변수 당신은 공동 인자와 Ands and Ors를 가지고 있기 때문에 보편적으로 부량 당신이 공동으로 요소를 풀어내는 곳, 그리고 함께

실존 적 양화를 할 수 있습니다 당신은 그들을 배제하고, 또는 그들을 배제합니다 당신은 satisfiability를 할 수 있습니다, 즉 하나의 노드에 대한 경로를 추적하여 함수가 하나가 된 것을 알 수 있습니다 하단에 이 모든 것들이 위에 구현됩니다

기본 BDD 데이터 구조 기본적인 아이디어는 우리가 부울 데이터의 유니버스를 입력 및 출력으로 처리하므로 우리는 상수 0과 1은 우리의 데이터 객체의 합입니다 우리는 변수를 가질 것이고, 우리는 Boolean 함수를 가질 것입니다 공유 BDD 그래프로 표현됩니다 그래서, 큰 트릭, 정말 큰 트릭은 우리는 각 연산자를 구현하여 연산자가 공유되고 축소되고 순서화 된 BDD이면 연산자의 출력 감소 된 주문 BBD 그래서,이 말을하는 또 다른 방법은 우리가 BDD의 잘못 수정 된 버전을 빌드하지 마십시오

우리는 항상 축소되고 주문되고 공유되는 것들로 시작합니다 그들을 지키십시오 그리고 대략적으로 말해서, 우리는 재귀적인 정렬하는 메소드는 함수를 맨 아래로 분리합니다 그런 다음 URP와 마찬가지로 맨 아래에서 다시 한 번 정렬합니다 이런 종류의 상향식으로 다시 위로 올려 놓음으로써 재귀가 다시 발생할 때 변수가 올바른 순서인지 확인합니다

적절한 축소가 무엇이든간에 우리가하고 있다는 것입니다 그래서, 이걸 생각해 보는 방법은, 조금 있습니다 여기서 약간의 예를 들자면, 별표를 붙일 것입니다 H는 BDD와 같습니다 저는 이것을 C와 같은 스타일로 작성했습니다

이것은 BDD로, 데이터 개체로 운영자는 일종의 F bdd와 G bdd를 취하고 H bdd를 생성하는 서브 루틴 그리고 너는 그게 좋다고 생각하고 싶어, 여긴 F 야, 그렇지? F는 BDD 노드의 큰 클라우드에있는 일부 그래프의 맨 위를 가리키는 포인터입니다 그리고 G는이 BDD 노드 클라우드의 다른 그래프에 대한 포인터입니다 아마도 F와 G가 겹칠 수도 있습니다

권리? 그리고 나서, 우리가 op를 호출하면 BDD F와 BDDs G, 우리는 새로운 BDD를 얻습니다 아마도 BDD H가 어딘가에있을 것입니다 아마도 그것도 일부 중복됩니다 아니면, 너도 알다시피, 여기에 있을지도 몰라 어딘가에

어쩌면 그것은 BDD H이거나 그리기 일 것입니다 여기에 점선이 있습니다 어쩌면 BDD H가 정말 큰 것일 수도 있습니다 복잡한 지저분한 것, 그리고 F와 G는 대부분 H 내부에 묻혀 있습니다 정말 알아

그것은 F에 의존하고, G에 의존하며, 의존한다 운영자는 H가 무엇인지에 관해서 하지만 공유 축소 순서로 시작합니다 이진 결정 다이어그램 그리고 당신은 당신이 필요로하는 통신 수를 구축합니다 실제 엔지니어링을 할 수 있습니다

그들이 당신에게 돌아 가기 위해 BDD를 주문하면 모든 것이 아름답게 작동합니다 그렇다면 실제 BDD를 어떻게 구현합니까? 그리고 가장 표준적인 예는 제가 여러분에게 논리 같은 것을 줄 것입니다 네트워크는 큰 로직 네트워크와 마찬가지로 10,000 개의 로직 게이트가있는 로직 네트워크이며, 50 개의 인풋과 20 개의 아웃풋이 있습니다 그리고 대답은, 당신이 백업을 구축 할 수 있다는 것입니다 근본적으로 게이트 레벨 네트워크를 점진적으로 걷는 것입니다

따라서 각 입력은 BDD입니다 각 게이트는 새 출력 BDD가 생성됩니다 그리고 우리는 BDD를 만들어냅니다 그 가치는 우리가 여기서 찾고있는 가치입니다 기본적으로 기본 BDD 작업에 대한 호출 스크립트입니다

그래서 오른쪽에 기본 BDD 연산자 스크립트가 표시되어 있습니다 그것은 매우 높은 수준의 일종입니다 이것은 의사 코드 종류의 일종입니다 1 단계에서 A가 변수 A를 생성한다고 말합니다 그리고 이것은 단지 일종의 속기 일뿐입니다

알다시피,이 단계는 오, 알았어 저는 변수 A를 만들려고합니다 그리고 그것은 함수이고 그것은 부울 함수입니다 그리고 여러분이 가리키는 것은이 변수 노드에 대한 0에서부터입니다 그리고 두 번째 변수는 변수를 생성하는 B입니다

B와 B는 변수입니다 그것을 가리키는 함수 세 번째 변수는 변수 C입니다 그것을 가리키는 함수를 만들고 있습니다 각 노드는 단일 노드입니다

BDD, 하나의 자식에서 상수 0을 가리키는 하나의 꼭지점, 낮음 아이 높은 아이 그리고 나서 흥미로 웠습니다 T1, 여기서 볼 수 있듯이 T1은 A와 B의 And입니다 내가 하나, 둘, 셋을했기 때문에 여기에 작은 체크 마크를 붙이려고합니다 T1은 A 함수와 B 함수의 And이므로 I가 가정 할 것입니다

가지고 있고 BDD 패키지의 운영자로 구현되었습니다 결과적으로 BDD A와 BDD B가 호출 될 때와 마찬가지로 뒤 BDD T1, 결과적으로이 작은 BDD를 가리킨다 4 단계 그리고 잠시 동안 이것 만 보시면, 당신은 볼 수 있습니다 예

실제로 BDD를위한 것입니다 하나의 노드는 변수, 변수 A와 변수 B가 모두 1 인 경우입니다 좋아요, 그거 알아요 다음에 어떻게 될까요? 음, T2는 양 B와 C의 And입니다 좋아, 음, T2는 그렇게 될 것입니다

그리고 T2는 5 단계의 결과 일 예정이며, 이는 약간의 BDD가 될 것입니다 B와 C에 대해서 우리는 다시 볼 수 있습니다 사소한 B BDD 이 작은 것에서 1을 얻는 유일한 길은, 사소한 BDD는 B와 C를 각각 1로하는 것입니다

다른 모든 경로는 0 노드로 연결됩니다 그리고 나서 다음 단계를 밟을 것입니다 분명히 out은 T1과 T2와 같습니다 T1은 BDD, T2는 BDD입니다 또는 BDD 패키지가있는 운영자입니다

우리를 위해 제공 할 것입니다 그리고 T1, T2에서 Or를 호출합니다 이것이 내가 얻는 것입니다 나갈거야, 이것과 동등하다 A, B + B, C가 될 것입니다

그리고 다시, 만약 우리가 이걸 응시하면 우리가 볼 수있는 동안, 오, 그래,이 의미가 있습니다 알다시피, 1을 얻는 방법은 A이고 B는 1, B와 C는 1입니다 당신에게 0을줍니다 그래서, 당신은 어떻게 정말로 뭔가를합니까? 복잡한? 내가 50,000 개의 논리 게이트를 주면 어떻게 될까? 나는 그것을 실제로 할 수 있었다 내가 BDD 스크립팅 패키지를 주었다면, 나는 실제로 그렇게 할 것입니다

내가 너에게 모든 논리를 주면 로직 네트워크를 나타내는 그래프를 조회 할 수 있습니다 이 BDD를 구축하기위한 적절한 순서를 결정할 수도 있습니다 각각의 내부 노드는 적절한 순서로 배치된다 그리고 And, Or Not에 대한 간단한 호출만으로 하나씩 구성 할 수 있습니다 Nand, Nor, Xor, Xnor 등

당신이 모든 단일성에 대한 BDD를 가질 때까지 게이트 레벨은 매우 복잡한 네트워크에서도 출력됩니다 그리고 당신이해야 할 유일한 결정은 당신이 무엇을 할 것인가입니다 변수 순서? 이제, 당신은 또한 다른 멋진 것들을 얻습니다 모든 실제 구현 된 BDD 패키지의 기능을 제공합니다 그것은 사물을 비교하기위한 것입니다

그래서, 가장 중요한 엔지니어링 중 하나 BDD 패키지와 같은 응용 프로그램에서 묻는 것은이 두 가지 부울입니다 함수, F와 G, 동일? 매우 자주, 그들이 대표하기 때문에 똑같은 논리의 다른 부분들, 그리고 실제로는 그들이 실제로 실제로 동일하다는 것을 알고 싶습니다 그래서, 당신이하는 일은 F에 대한 BDD를 만들고 당신은 G에 대한 BDD를 만들고, 그런 다음 포인터를 비교하면됩니다 그리고 주문 BDD가 줄어든 것을 기억합시다 정식이다

F와 G가 실제로 동일한 부울 함수와 같은 그래프입니다 그러나 우리가 공유하고 있기 때문에, 공유 BDD는 동일한 그래프 일뿐만 아니라 정확한 BDD임을 강조합니다 같은 그래프 포인터는 같은 위치를 가리 킵니다 그래서, 당신이 알다시피, 이것이 작동 할 수있는 방법은 당신이 FDD 용 BDD를 만드는 것입니다

좋아, 있네 그런 다음 G 용 BDD를 만들고 당신이 얻는 것은 똑같은 것을 가리키는 포인터입니다 너는 그것의 또 다른 사본을 얻지 않는다 이건 매우 중요합니다 너는 그것의 또 다른 사본을 얻지 않는다

당신은 그것의 다른 버전을 얻지 못합니다 같은 장소에 같은 노드가 생기는 경우 같은 그래프를 얻을 수있어, 알았지? 그래서 F에 대한 BDD를 만들고 G에 대한 BDD를 작성하고 동일한 함수이면 포인터는 다음과 같습니다 같은 말 그대로, 이것은 매우 복잡한 소리를 내며,이 두 개의 5 만 게이트 논리 네트워크가 동일하며, 알다시피, F 포인터와 G에 대한 두 개의 정수 주소 비교 포인터, 둘 다 컴퓨터 메모리의 동일한 노드를 가리키고 있습니까? 상위 변수를 나타냅니다? 그것은 꽤 놀라운 종류의 강력한 것입니다

결과 따라서 두 개의 부울 함수가 동일합니까? F를 만들면 포인터가 같으면 G를 만듭니다 그러나 그들이 동일하지 않으면 어떡하지? 그럼, 우리는 또 다른 흥미로운 우리가 할 수있는 일 우리가 너를 극복하고 나면 우리의 F와 G가 같지 않은 불행, 우리가 원하는 질문 물어 보면 그들이 내게 다른 점을 알 수 있습니까? 그리고, 당신이 생각하는 방식은 F와 그것입니다 알다시피, 많은 정보를 얻었습니다

여기 G가 있습니다 동일한 입력, 호출, 호출 x 내가 할 일은 자신을 그 출력을위한 배타 OR 게이트 그래서, 저는 새로운 함수를 만들겠습니다 그것을 H라고 부르지, 그렇지? 그리고 새로운 함수 H는 1을 만듭니다

F가 G와 일치하지 않을 때 F가 다른 경우 동일한 입력에 대해 G보다 출력, 알았지? 그래서 저는 F를위한 BDD를 만들 계획입니다 거기는 g 용 BDD를 만들 계획입니다 거기는

그들이 뭔가를 공유한다고 가정하겠습니다 그들은 똑같은 기능을해야하기 때문입니다 그런 다음 H 용 BDD를 구축 할 예정입니다 그걸 어떻게 그리는 지 정말로 모르겠지만, 그것이 무언가라고 가정 해 봅시다 정말로 크고 복잡하고, 일종의 그들을 포괄합니다

그리고 나서 H가 만족할만한 것인지 물어볼 것입니다 이것은 제가 물어볼 것을 의미합니다 H의 맨 위에서 한 노드까지의 경로가 있다면 그리고 그러한 경우에, H의 맨 위에서 1 노드로가는 모든 경로 H를 1로 만드는 변수의 값을 지정합니다 그것들은 F와 G를 하드웨어의 일부로 만들고, 출력, 0,1, 또는 1, 0이다

이들은 F가 F와 일치하지 않는 입력이다 G 너도 알다시피, 아마 그 것들을 사용할 수있을거야 왜 F가 G와 같지 않은지 알아 내야합니다 F가 같다고 생각되면 또는 F가 G와 같지 않을 수도 있습니다

그리고 당신은 그 (것)들을 다른 무엇이 알기를 원합니다 여기 당신이하는 방법입니다 그리고 다시, 당신은 F를, 당신은 G를, 당신은, 아시다시피 독점적 인 Oring의 BDD 패키지에 내장 된 작업을 호출합니다 두 개의 부울 함수 그리고 쾅, 실제로 결과를 얻었습니다

다시 매우 강력하고 BDD입니다 놀라운 일을 할 수 있습니다 놀라 울 정도로 놀랍습니다 컨텍스트의 엔지니어링 종류, 더 유용한 BDD 응용 프로그램

음담 검사를 할 수 있습니다 우리는 이미 일종의 언급했다 이 나는 전체 강의를 보냈다 Unate 재귀 패러다임 큐브 목록 tautology 정말 좋았 기 때문에 워밍업

하지만 당신은 실제로 그렇게하지 않았을 것입니다 음, 대부분 당신은 그렇게하지 않을 것입니다 아마도 BDD를 구축하기 만하면됩니다 BDD를 사용하면 모양이 사소하기 때문입니다 함수가 1과 같은 경우, 그 함수는 우리가 정식이기 때문에 일어날 수있는 유일한 방법입니다

단 하나의 표현이 있습니다 그리고 우리는 공유됩니다 모든 진리표가 동일한 진리표라고 여겨지는 여러 기능이 있다면, 그들은 모두 동일한 노드를 가리 킵니다 그래서, 그것이 1이라면, 그것은 단지 1 노드를 가리 킵니다 그래서, 와우, 그것은 훨씬 적은 일의 지옥입니다

satisfiability는 어떨까요? 그리고 언제, 언제 만족할 수있게됩니다 부울 방정식을 푸십시오 당신은 어떤 가치가 그것과 동등한 것이라고 말합니까? 글쎄, 나는 큐블리스트와 함께 그것을 어떻게 할 지 모른다 하지만 여기에서 알다시피, 뿌리에서 잎으로가는 길을 찾을 수있는 한 하나의 노드, 당신은 그것을 할 수 있습니다 그래서이 기능을 만족시키는 한 가지 방법은 예를 들어, X1은 1, X2입니다

값이 무엇인지 신경 쓰지 않습니다 X3, 나는 가치가 무엇인지 상관하지 않는다 X4는 1입니다 그래서,이 작은 BDD를 위해서, 당신도 알다시피, 그냥 작동합니다 그리고 비슷하게, 그것은 그것을 할 수있는 또 다른 패턴입니다

따라서 X1은 0, X2는 1, X3는 신경 쓰지 않고 X4는 1뿐입니다 BDD를 구축하는 한, 기본적으로 당신은 BDD를 거꾸로 갈 수 있습니다 하나의 노드라면 포인터를 두 가지 방법으로 모두 사용할 수 있습니다 그래서 이것은 단지 여기에 쓰려고하는 또 다른 것입니다 이것은 BDD 패키지에 구현 된 또 다른 연산자입니다

당신은 질문을 할 수 있습니다, 그것이 만족 스러운가? 그리고 당신은 만족스러운 가치관을 요구할 수 있습니다 그래서 이것 모두는 사실로보기 엔 너무 좋은 것 같습니다 그래서,이 시점에서, 당신이 열심히 일종의 생각이라면, 당신은 조금 있어야합니다 의심 많은 그리고 그 중 하나, 당신이해야 할 이유 조금 의심 스럽네

소년 그게 내가 거의 모든 걸 취할 수있는 것 같아 근본적으로 이론적으로 기하 급수적으로 어려운, 당신도 알다시피, 컴퓨터 과학 문제 내가 BDD를 구축 할 수 있다면 와우, 알아 내가 해결할 수있는 것 같아

어떻게 우리 모두는 여전히 직업을 가지고 있습니까? 알다시피, 어떻게 문제가 생길까요? 해결하기 위해 남았습니까? 그리고 문제가 있습니다 사실, 정말 큰 문제가 있습니다 그리고 문제는 변수가 BDD 문제를 구성하는 데 사용한 주문 그리고 중요한 것은 무엇을 의미합니까? 대답은, 만약 당신이 좋은 주문을하면 합리적인 공간에서 BDD를 만들 수 있습니다 여기 BDD가 있습니다

아주 간단한 함수입니다 A1 및 a1 + a2 및 b2 + a3 및 b3 그래서 저는 n이 3이라고 여기에서 말할 것입니다 너는 네가 좋아하는만큼 너를 알 수있게 만들 수 있기 때문이야 왼쪽에있는 BDD는 좋은 순서가 있습니다

그 순서는 a1, b1, a2, b2, a3, b3입니다 이 아주 단단한 작은 선형 체인입니다 그것은 선형 성장을 나타내며, N은 다음과 같다 말하자면 크기가 N과 같이 정렬되는 것 같습니다 일정 시간 N, 맞습니까? 그러나 오른쪽 순서는 당신은 a의 모든 것을 먼저하고, 그러면 b의 모든 것이 지수 함수 적으로 이루어집니다

크기가 BDD입니다 이 BDD의 크기는 N에게 2라는 명령을 내렸고, 그것은 매우 불행한 상황입니다 그래서,이 문제를 정말로 어렵게 만드는 문제는, 바로 그 것입니다 매우 효율적인 솔루션을 가진 많은 문제가 있습니다 BDD를 구축 할 수 있다면이 점을 강조 할 것입니다

문제는 BDD를 항상 구축 할 수 없다는 것입니다 그래서 저는 이것을 여기 저기 쓰고 있습니다 여러분이 알고있는 것은 정말 재미 있습니다 문제 알려진 몇 가지 문제 기하 급수적으로 어려운 것은 BDD에서 매우 쉽습니다

문제는 이러한 문제의 모든 사례를 해결할 수 없다는 것입니다 문제는 문제의 BDD 크기가 합리적 일부 문제는 멋진 작은 BDD, 다른 문제를 만듭니다 병적 인 대형 BDD를 만드십시오 그리고 보편적 인 해결책은 없습니다

나는 그것을 강조 할 것입니다 보편적 인 해결책은 없습니다 항상 기하 급수적으로 어려운 문제를 쉽게 해결하고 우리는 모두 직업에서 벗어납니다 사람들이 어떻게이 일을 처리합니까? 음, 거기에 많은 작업이 있습니다 변수 순서 지정 휴리스틱 스

당신은 주문하는 방법을 어떻게 생각합니까? 합리적인 문제에 대한 좋은 BDD 거기에 많은 연구가 있습니다 특성화가 있습니다 어떤 문제가 발생하지 않았는지 알아야합니다 멋진 BDD이므로 시도하지 마십시오

몇 가지 예를 드리겠습니다 승수는 그 중 하나입니다 추가 기능은 훌륭하고 승수는 무서운 동적 인 주문 기술도 있습니다 동적 순서 지정 기술을 사용하면 BDD 소프트웨어 패키지가 자체적으로 주문을 선택할 수 있습니다

스크립트가 실행될 때 동적으로 조정하여 최상의 결과를 얻으십시오 주문 그것은 실제로 꽤 흥미 롭습니다 우리는 그것에 대해 말할 시간이 없지만, 사실 그것은 사람들은 오늘 실제로 연습합니다 너 한테 약간의 직감을 줄거야

BDD 주문에 관해서 엄지 손가락의 규칙이 있습니다 그래서 저는 같은 기능을 다시 나타냅니다, a1, b1 plus a2, b2 plus a3, b3 여기에는 선형 순서 BDD가 있습니다 왼쪽에는 선형 크기 BDD가 있고 기하 급수적 인 크기의 무슨 일 이니? 자, 엄지 손가락의 규칙을 읽으십시오

관련 입력은 서로 가까이 있어야합니다 순서 입력을 결정하는 입력 그룹 기능 자체는 모두 하나가되어야하고 서로 가깝고 두 개는 상단 근처에 있어야합니다 BDD의 이것은, 휴리스틱 스입니다 이것은 당신이 아닙니다

알고, 완벽한 해결책 하지만 왼쪽에서 관찰 해 보겠습니다 알다시피, a1, ai 쌍은 모두 순서대로 서로 옆에 있습니다 알다시피,이 함수에서 내가 여기에 ai와 bi를 보여줄 것이기 때문에, 맞습니까? 함수의 값을 함께 결정할 수 있습니다 그래서, ai를 가짐으로써, bi 쌍은 당신이 AI를 얻을 때마다 서로 가깝게, bi 한 쌍, 알다시피, 너, 너는 ai를 선택하고, a2 값을 말한 다음, 너는 b2 값을 선택하십시오

글쎄, 당신은 실제로 당신이 할 수 있는지, a2와 b2가 0이면 a1을 만듭니다 그리고 그렇지 않다면 a와 b에 관해 더 이상 알 필요가 없습니다 정렬 할 수 있습니다 순서대로 여러 가지를 보여줄 수는 없습니다 그냥 계속 나아갈 수 있습니다

너는 알다시피, 오른쪽에있는 것을 보아라 손 쪽 솔직히 말해서 기본적으로 기본적으로 당신이 할 수있는 최악의 순서 이것은 단지 끔찍한 일입니다 그리고 이것에 대해 잠깐 보게되면, 이걸 얻게됩니다, 이런, 이런 종류의 재미있는 작은 집 그림 여기

이 사람은 모든 것을 먼저 가지고 있고 모든 b 그것은 끔찍한 일입니다 그 이유는 AI의 값을 결정할 수있는 BI 쌍이 필요하기 때문입니다 함수 그 말은 네가 나에게 모든 것을 주면 아이의 첫 번째, 나는 그들 모두를 기억해야한다

그래서 다이어그램의 첫 번째 단계는 a1, 나는 함수의 가치에 관해 당신에게 아무 것도 말할 수 없습니다 따라서 다이어그램의 다음 단계에는 두 개의 a2가 있으며 모든 것을 기억해야합니다 함수의 가치에 대해서는 말할 수 없기 때문입니다 BDD의 수준이 너무 낮 으면 네가 대답 할 수 없기 때문에 네 개의 a3이 있습니다 함수의 값에 대해

내가 40 a와 40 b를 가졌다면 2 이 계급의 40 가지 나는 아직 b가 없기 때문에 나는 말할 수 없다 당신에게 함수의 가치 그리고 제가 소개 할 때까지는 아닙니다 BDD에 실제로 결정을 내리고 그 결정의 가치를 말할 수 있습니다 기능

따라서 입력을 결정할 수있는 입력 그룹 그 기능 자체는 서로 가깝게 있어야하며 넓게 분리되어 있지 않아야합니다 왜냐하면 당신이 그것들을 널리 분리 시키면 BDD가 커질 것이기 때문입니다 그냥 넓어졌습니다 네가 가지고 있기 때문에 중간에 지방이된다 해당 BDD의 가능한 모든 값을 기억합니다

BDD가 가능한 모든 가치를 기억하는 방식은 노드와 많은 가장자리 그리고 그것은 모두를 불행하게 만듭니다 그래서 관련 입력은 서로 가까이 있어야합니다 기능을 스스로 결정할 수있는 입력 그룹은 가까이 있어야합니다 서로

그리고 최대한 멀리 할 수 ​​있습니다 BDD 상단으로 올라간다 항상 그럴 수는 없지만 그게 기본입니다 경험적 방법 그것은 아는 것이 중요합니다

알다시피, BDD의 경우 작동하며 BDD의 경우 작동하지 않는 작동은 다음과 같습니다 따라서 산술적 인 흐름이 정말로 중요합니다 사람들이 데이터를 만듭니다 항상 경로 BDD는 어떻게되어 있습니까? 기본 체인을 가진 회로는 선형 크기로 축소 된 순서를가집니다

BDD, 가산기, 감산기, 비교기 등이 있습니다 우선 순위 인코더에서 b보다 큼 그것들은 당신이 알고 있습니다 심장에는 운반 체인이 있고 선형 크기의 BDD가 있습니다 그리고 규칙은 항상 캐리 체인에 대한 BBD 순서로 변수를 대체한다는 것입니다 회로

그래서, 당신이 아무것도 기억하지 못한다면 주문하는 법에 관해서는 이걸 기억해, 그렇지? A0, b0, a1, b1, a2, b2 일반적으로 낮은 주문 입찰가가 무엇이든 종류의 순서가 있습니다 첫 번째로 가장 적은 작업으로 계산할 수있는 것이 무엇이든간에 주문 그리고 언제나, 항상 항상 변합니다 절대로 절대 절대로 모든 것을 수행하지 말고 모든 것을하십시오

따라서 모든 산술 회로가 쉽고 모두 가능하면 멋질 것입니다 유감스럽게도 틀린 것입니다 또한 최상의 순서는 선형입니다 그것은 우리를 행복하게합니다 최악의 순서는 기하 급수적입니다

그렇게 좋았어 나쁘다 선형 정렬은 a와 b를 번갈아 사용합니다 기하 급수적 인 순서는하지 마라 곱셈, 오, 그건 아주 불행한 사람

두 가지를 곱하십시오 항상 지수 적 BBD입니다 그것은 정말로 나쁜 것입니다 다른 데이터 구조가 필요하며 실제로 존재합니다 그들은 다른 종류의 정식 양식을 가진 다른 종류의 결정 다이어그램입니다

승수와 같은 것을 나타낼 수 있습니다 우리는 그들에 대해 말할 시간이 없지만 그들은 실제로 존재합니다 따라서 바이너리를 사용한 일반적인 경험 결정 다이어그램은 많은 작업이 BDD 크기의 합리적인 순서로 정렬되어 있으며, 감소 된 차수의 BDD 크기 알고리즘은 실용적입니다 알다시피, 1 억 노드는 정말로 큰 메모리 양을 알고 있습니다

그리고 사람들은 작동하는 순서를 찾는 데 많은 노력을 기울입니다 그것은 BDD의 유일한 단점입니다 그래서 여기 있습니다 우리는 우리의 마지막 단계에 있습니다 중요한 데이터 구조, 감소, 정렬, 이진 결정 다이어그램, ROBDD 또는 요즘 모두 BDD라고 부르는 요즘

그것들은 표준 형태입니다 부울을위한 데이터 구조입니다 기능 두 개의 부울 함수는 BDD가 동일한 경우에만 가능합니다 불리언 함수는 단지 포인터 일뿐입니다

BDD 그래프의 루트 노드 공유 BDD의 모든 노드는 일부를 나타냅니다 우리는 그 공유를 매우 지능적으로 사용할 수 있습니다 공유 BDD에서 함수 F가 함수 G와 똑같은지 테스트 할 수 있습니다 그들의 포인터가 평등한지 점검함으로써 실제로 루트 노드를 가리 킵니까? 정말 멋지다

오늘 일반의 많은 부분을위한 기초 부울 것들에 대한 조작 Bdd는 매우 광범위하게 사용되고 있습니다 CAD 업계에서, 그리고 실제로 많은 다른 응용 프로그램에서 문제는 가변 주문이 중요하다는 것입니다 그것은 BDD의 백만 노드를 필요로하는 것과, 아시다시피, BDD의 100 노드에 2 개, 그리고 때때로 BDD가 너무 크고 그냥 그것을 만들 수 없습니다 우리를 다른 모든 계급으로 인도합니다

표현 및 알고리즘 아시다시피 놀랍습니다 그러나 때로는 SAT라고 불리는 것을 알고 싶어합니다 때로는 부울 함수를 작성하여 표시 할 내용을 묻는 경우도 있습니다 더 간단한 질문이지만,이 부울 함수를 만족시키고 그것을 만들 수있는 방법이 있습니까? 1? 그렇다면, 제게 가치를주십시오

그 일을하는 변수? 그리고 이것을 만족시킬 수 없다면 부울 함수, 나를 위해 그것을 증명하십시오 그리고 그 정보를 반환하십시오 아니요,이 부울 함수를 만족시킬 수 없습니다 얼마나 많은 실용적인 것들이 다른 형태로 만들어 질 수 있는지는 놀랍습니다 이는 우리를 대표하는 계획에 관한 다음 강의 시리즈로 인도 할 것입니다

부울 만족을위한 해법