class MultiLevelCell: def __init__(self, channel_length, drift_velocity, levels): self.channel_length = channel_length self.drift_velocity = drift_velocity self.levels = levels self.trapped_electrons = 0 self.value = 0 self.wear_count = 0 self.retention_loss = 0.0 def program(self, value): self.value = max(0, min(self.levels-1, value)) self.trapped_electrons = self.value self.wear_count += 1 self.retention_loss = 0.0 prog_time = self.channel_length / self.drift_velocity return prog_time def erase(self): self.trapped_electrons = 0 self.value = 0 self.wear_count += 1 self.retention_loss = 0.0 erase_time = self.channel_length / self.drift_velocity return erase_time def read(self): import random if self.value > 0: self.retention_loss += random.uniform(0, 0.01) if self.retention_loss > 0.5: self.value = max(0, self.value - 1) self.trapped_electrons = self.value self.retention_loss = 0.0 return self.value