ZLayout EDA Library v1.0.0
Advanced Electronic Design Automation Layout Library with Bilingual Documentation
Loading...
Searching...
No Matches
logic_circuits.py
Go to the documentation of this file.
1#!/usr/bin/env python3
2"""
3复杂逻辑电路类系统
4只保留有复杂时序逻辑和状态机的组件,其他基本组件使用数据库存储
5"""
6
7from typing import Dict, List, Any, Optional, Set, Tuple
8from enum import Enum
9from dataclasses import dataclass
10import time
11
12class LogicState(Enum):
13 """逻辑状态"""
14 LOW = 0
15 HIGH = 1
16 UNKNOWN = 2
17 HIGH_IMPEDANCE = 3
18
19class ClockEdge(Enum):
20 """时钟边沿"""
21 RISING = "rising"
22 FALLING = "falling"
23 BOTH = "both"
24
25@dataclass
26class Signal:
27 """信号定义"""
28 name: str
29 state: LogicState = LogicState.UNKNOWN
30 timestamp: float = 0.0
31
32 def set_state(self, state: LogicState):
33 """设置信号状态"""
34 self.state = state
35 self.timestamp = time.time()
36
38 """状态机基类"""
39
40 def __init__(self, name: str):
41 self.name = name
42 self.current_state = "IDLE"
43 self.states: Set[str] = {"IDLE"}
44 self.transitions: Dict[str, Dict[str, str]] = {}
45 self.state_history: List[Tuple[str, float]] = []
46 self.input_signals: Dict[str, Signal] = {}
47 self.output_signals: Dict[str, Signal] = {}
48
49 def add_state(self, state: str):
50 """添加状态"""
51 self.states.add(state)
52
53 def add_transition(self, from_state: str, to_state: str, condition: str):
54 """添加状态转移"""
55 if from_state not in self.transitions:
56 self.transitions[from_state] = {}
57 self.transitions[from_state][condition] = to_state
58
59 def add_input(self, signal_name: str):
60 """添加输入信号"""
61 self.input_signals[signal_name] = Signal(signal_name)
62
63 def add_output(self, signal_name: str):
64 """添加输出信号"""
65 self.output_signals[signal_name] = Signal(signal_name)
66
67 def process_inputs(self):
68 """处理输入信号,子类需要实现"""
69 pass
70
71 def transition_to(self, new_state: str):
72 """状态转移"""
73 if new_state in self.states:
74 old_state = self.current_state
75 self.current_state = new_state
76 self.state_history.append((new_state, time.time()))
77 print(f"[{self.name}] State transition: {old_state} -> {new_state}")
78
79 def get_state_history(self) -> List[Tuple[str, float]]:
80 """获取状态历史"""
81 return self.state_history
82
84 """时序逻辑电路基类"""
85
86 def __init__(self, name: str):
87 self.name = name
88 self.clock_signal = Signal("clock")
89 self.reset_signal = Signal("reset")
90 self.enable_signal = Signal("enable")
91 self.inputs: Dict[str, Signal] = {}
92 self.outputs: Dict[str, Signal] = {}
93 self.internal_state: Dict[str, Any] = {}
94 self.clock_edge = ClockEdge.RISING
95 self.setup_time = 0.1 # ns
96 self.hold_time = 0.1 # ns
97 self.propagation_delay = 0.5 # ns
98
99 def add_input(self, signal_name: str):
100 """添加输入信号"""
101 self.inputs[signal_name] = Signal(signal_name)
102
103 def add_output(self, signal_name: str):
104 """添加输出信号"""
105 self.outputs[signal_name] = Signal(signal_name)
106
107 def on_clock_edge(self):
108 """时钟边沿触发,子类需要实现"""
109 pass
110
111 def reset(self):
112 """复位操作,子类需要实现"""
113 pass
114
115 def check_timing(self) -> bool:
116 """检查时序约束"""
117 # 简化的时序检查
118 return True
119
121 """触发器"""
122
123 def __init__(self, name: str, ff_type: str = "D"):
124 super().__init__(name)
125 self.ff_type = ff_type
126
127 if ff_type == "D":
128 self.add_input("D")
129 self.add_output("Q")
130 self.add_output("Q_bar")
131 elif ff_type == "JK":
132 self.add_input("J")
133 self.add_input("K")
134 self.add_output("Q")
135 self.add_output("Q_bar")
136 elif ff_type == "SR":
137 self.add_input("S")
138 self.add_input("R")
139 self.add_output("Q")
140 self.add_output("Q_bar")
141
142 self.internal_state["Q"] = LogicState.LOW
143
144 def on_clock_edge(self):
145 """时钟边沿触发"""
146 if self.reset_signal.state == LogicState.HIGH:
147 self.reset()
148 return
149
150 if self.enable_signal.state == LogicState.LOW:
151 return
152
153 if self.ff_type == "D":
154 self._handle_d_ff()
155 elif self.ff_type == "JK":
156 self._handle_jk_ff()
157 elif self.ff_type == "SR":
158 self._handle_sr_ff()
159
160 def _handle_d_ff(self):
161 """处理D触发器"""
162 d_input = self.inputs["D"].state
163 if d_input in [LogicState.LOW, LogicState.HIGH]:
164 self.internal_state["Q"] = d_input
165 self.outputs["Q"].set_state(d_input)
166 self.outputs["Q_bar"].set_state(
167 LogicState.HIGH if d_input == LogicState.LOW else LogicState.LOW
168 )
169
170 def _handle_jk_ff(self):
171 """处理JK触发器"""
172 j_input = self.inputs["J"].state
173 k_input = self.inputs["K"].state
174 current_q = self.internal_state["Q"]
175
176 if j_input == LogicState.LOW and k_input == LogicState.LOW:
177 # 保持状态
178 pass
179 elif j_input == LogicState.LOW and k_input == LogicState.HIGH:
180 # 复位
181 self.internal_state["Q"] = LogicState.LOW
182 elif j_input == LogicState.HIGH and k_input == LogicState.LOW:
183 # 置位
184 self.internal_state["Q"] = LogicState.HIGH
185 elif j_input == LogicState.HIGH and k_input == LogicState.HIGH:
186 # 翻转
187 self.internal_state["Q"] = LogicState.HIGH if current_q == LogicState.LOW else LogicState.LOW
188
189 self.outputs["Q"].set_state(self.internal_state["Q"])
190 self.outputs["Q_bar"].set_state(
191 LogicState.HIGH if self.internal_state["Q"] == LogicState.LOW else LogicState.LOW
192 )
193
194 def _handle_sr_ff(self):
195 """处理SR触发器"""
196 s_input = self.inputs["S"].state
197 r_input = self.inputs["R"].state
198
199 if s_input == LogicState.LOW and r_input == LogicState.LOW:
200 # 保持状态
201 pass
202 elif s_input == LogicState.LOW and r_input == LogicState.HIGH:
203 # 复位
204 self.internal_state["Q"] = LogicState.LOW
205 elif s_input == LogicState.HIGH and r_input == LogicState.LOW:
206 # 置位
207 self.internal_state["Q"] = LogicState.HIGH
208 else:
209 # 非法状态
210 self.internal_state["Q"] = LogicState.UNKNOWN
211
212 self.outputs["Q"].set_state(self.internal_state["Q"])
213 self.outputs["Q_bar"].set_state(
214 LogicState.HIGH if self.internal_state["Q"] == LogicState.LOW else LogicState.LOW
215 )
216
217 def reset(self):
218 """复位"""
219 self.internal_state["Q"] = LogicState.LOW
220 self.outputs["Q"].set_state(LogicState.LOW)
221 self.outputs["Q_bar"].set_state(LogicState.HIGH)
222
224 """计数器"""
225
226 def __init__(self, name: str, width: int = 8, count_up: bool = True):
227 super().__init__(name)
228 self.width = width
229 self.count_up = count_up
230 self.max_count = (1 << width) - 1
231 self.internal_state["count"] = 0
232
233 # 添加输出信号
234 for i in range(width):
235 self.add_output(f"Q{i}")
236
237 self.add_output("carry")
238 self.add_output("zero")
239
240 def on_clock_edge(self):
241 """时钟边沿触发"""
242 if self.reset_signal.state == LogicState.HIGH:
243 self.reset()
244 return
245
246 if self.enable_signal.state == LogicState.LOW:
247 return
248
249 current_count = self.internal_state["count"]
250
251 if self.count_up:
252 new_count = (current_count + 1) % (self.max_count + 1)
253 carry = (current_count == self.max_count)
254 else:
255 new_count = (current_count - 1) % (self.max_count + 1)
256 carry = (current_count == 0)
257
258 self.internal_state["count"] = new_count
259
260 # 更新输出
261 for i in range(self.width):
262 bit_value = (new_count >> i) & 1
263 self.outputs[f"Q{i}"].set_state(
264 LogicState.HIGH if bit_value else LogicState.LOW
265 )
266
267 self.outputs["carry"].set_state(LogicState.HIGH if carry else LogicState.LOW)
268 self.outputs["zero"].set_state(LogicState.HIGH if new_count == 0 else LogicState.LOW)
269
270 def reset(self):
271 """复位"""
272 self.internal_state["count"] = 0
273 for i in range(self.width):
274 self.outputs[f"Q{i}"].set_state(LogicState.LOW)
275 self.outputs["carry"].set_state(LogicState.LOW)
276 self.outputs["zero"].set_state(LogicState.HIGH)
277
279 """处理器有限状态机"""
280
281 def __init__(self, name: str):
282 super().__init__(name)
283
284 # 添加处理器状态
285 self.add_state("FETCH")
286 self.add_state("DECODE")
287 self.add_state("EXECUTE")
288 self.add_state("WRITEBACK")
289 self.add_state("HALT")
290
291 # 添加状态转移
292 self.add_transition("IDLE", "FETCH", "start")
293 self.add_transition("FETCH", "DECODE", "instruction_ready")
294 self.add_transition("DECODE", "EXECUTE", "decoded")
295 self.add_transition("EXECUTE", "WRITEBACK", "executed")
296 self.add_transition("WRITEBACK", "FETCH", "written_back")
297 self.add_transition("EXECUTE", "HALT", "halt_instruction")
298
299 # 添加信号
300 self.add_input("clock")
301 self.add_input("reset")
302 self.add_input("start")
303 self.add_input("instruction_ready")
304 self.add_input("decoded")
305 self.add_input("executed")
306 self.add_input("written_back")
307 self.add_input("halt_instruction")
308
309 self.add_output("fetch_enable")
310 self.add_output("decode_enable")
311 self.add_output("execute_enable")
312 self.add_output("writeback_enable")
313 self.add_output("halt")
314
315 def process_inputs(self):
316 """处理输入信号"""
317 current_state = self.current_state
318
319 # 根据当前状态和输入信号决定下一个状态
320 if current_state == "IDLE" and self.input_signals["start"].state == LogicState.HIGH:
321 self.transition_to("FETCH")
322 elif current_state == "FETCH" and self.input_signals["instruction_ready"].state == LogicState.HIGH:
323 self.transition_to("DECODE")
324 elif current_state == "DECODE" and self.input_signals["decoded"].state == LogicState.HIGH:
325 self.transition_to("EXECUTE")
326 elif current_state == "EXECUTE":
327 if self.input_signals["halt_instruction"].state == LogicState.HIGH:
328 self.transition_to("HALT")
329 elif self.input_signals["executed"].state == LogicState.HIGH:
330 self.transition_to("WRITEBACK")
331 elif current_state == "WRITEBACK" and self.input_signals["written_back"].state == LogicState.HIGH:
332 self.transition_to("FETCH")
333
334 # 更新输出信号
335 self.update_outputs()
336
337 def update_outputs(self):
338 """更新输出信号"""
339 # 清除所有输出
340 for signal in self.output_signals.values():
341 signal.set_state(LogicState.LOW)
342
343 # 根据当前状态设置输出
344 if self.current_state == "FETCH":
345 self.output_signals["fetch_enable"].set_state(LogicState.HIGH)
346 elif self.current_state == "DECODE":
347 self.output_signals["decode_enable"].set_state(LogicState.HIGH)
348 elif self.current_state == "EXECUTE":
349 self.output_signals["execute_enable"].set_state(LogicState.HIGH)
350 elif self.current_state == "WRITEBACK":
351 self.output_signals["writeback_enable"].set_state(LogicState.HIGH)
352 elif self.current_state == "HALT":
353 self.output_signals["halt"].set_state(LogicState.HIGH)
354
355# 使用示例
356if __name__ == "__main__":
357 print("=== 复杂逻辑电路系统演示 ===")
358
359 # 创建D触发器
360 print("\n--- D触发器演示 ---")
361 d_ff = FlipFlop("D_FF_1", "D")
362 d_ff.inputs["D"].set_state(LogicState.HIGH)
363 d_ff.enable_signal.set_state(LogicState.HIGH)
364
365 print(f"D输入: {d_ff.inputs['D'].state}")
366 d_ff.on_clock_edge()
367 print(f"Q输出: {d_ff.outputs['Q'].state}")
368 print(f"Q_bar输出: {d_ff.outputs['Q_bar'].state}")
369
370 # 创建计数器
371 print("\n--- 4位计数器演示 ---")
372 counter = Counter("Counter_4bit", width=4, count_up=True)
373 counter.enable_signal.set_state(LogicState.HIGH)
374
375 print("计数器状态:")
376 for i in range(6):
377 counter.on_clock_edge()
378 count_value = counter.internal_state["count"]
379 print(f"时钟{i+1}: 计数值={count_value}, 零标志={counter.outputs['zero'].state}")
380
381 # 创建处理器状态机
382 print("\n--- 处理器状态机演示 ---")
383 cpu_fsm = ProcessorFSM("CPU_FSM")
384
385 # 模拟处理器执行过程
386 print("处理器状态转移:")
387 cpu_fsm.input_signals["start"].set_state(LogicState.HIGH)
388 cpu_fsm.process_inputs()
389
390 cpu_fsm.input_signals["instruction_ready"].set_state(LogicState.HIGH)
391 cpu_fsm.process_inputs()
392
393 cpu_fsm.input_signals["decoded"].set_state(LogicState.HIGH)
394 cpu_fsm.process_inputs()
395
396 cpu_fsm.input_signals["executed"].set_state(LogicState.HIGH)
397 cpu_fsm.process_inputs()
398
399 cpu_fsm.input_signals["written_back"].set_state(LogicState.HIGH)
400 cpu_fsm.process_inputs()
401
402 print("\n=== 总结 ===")
403 print("✓ 复杂逻辑电路使用类来处理时序和状态")
404 print("✓ 基本组件(电阻、电容等)使用数据库存储")
405 print("✓ 这种混合架构更适合EDA工具的实际需求")
406 print("✓ 状态机和时序逻辑需要复杂的行为建模")
407 print("✓ 数据库存储提供了更大的灵活性")
__init__(self, str name, int width=8, bool count_up=True)
__init__(self, str name, str ff_type="D")
set_state(self, LogicState state)
add_output(self, str signal_name)
add_transition(self, str from_state, str to_state, str condition)
List[Tuple[str, float]] get_state_history(self)