Generating don't-cares for logic blocks in a boolean network and using them to simplify and restructure the network - this subject captured by imagination ever since I first learned what is satisfiability and observability. Just imagine a large boolean network, an intricate web of logic blocks, their functionality specified by equations, cube sets, or decision diagrams. By themseleves, the block may be large or small, easy or difficult to implement, but when they are encountered in the context of the network, their properties undergo a startling change. Now they can be modified, sometimes very substantially, without changing the functionality of the network! This is because of the specific structure represented by the interconnection of logic blocks. Each block has its neiborhood, which defines what input combinations can happen at the block's inputs and what output values will matter when propaged to the primary outputs. Knowledge about the inherent flexibilities of the logic blocks in the network - how much each block can be changed without affecting the overall functionality, can other blocks change at the same time or not, - this knowledge is expressed using the concept of internal don't-cares...
Recently, I performed a study of different don't-care generation methods. The results can be found here.
Some other materials related to this fascinating subject are likely to appear soon.