FServe / vram /nvme.py
Factor Studios
Upload 37 files
e9bc512 verified
from interface import PCIeInterface
import threading
import queue
import time
class NVMeCommand:
def __init__(self, cmd_type, lba, data=None):
self.cmd_type = cmd_type # 'read' or 'write'
self.lba = lba
self.data = data
self.result = None
self.completed = threading.Event()
class NVMeController:
def __init__(self, ssd_controller, queue_depth=64):
self.ssd = ssd_controller
self.submission_queue = queue.Queue(maxsize=queue_depth)
self.completion_queue = queue.Queue(maxsize=queue_depth)
self.running = True
self.worker = threading.Thread(target=self.process_commands)
self.worker.daemon = True
self.worker.start()
self.interface = PCIeInterface()
def submit(self, cmd):
self.submission_queue.put(cmd)
def process_commands(self):
while self.running:
try:
cmd = self.submission_queue.get(timeout=0.1)
if cmd.cmd_type == 'write':
self.ssd.program(cmd.lba, cmd.data)
self.interface.simulate_transfer(len(cmd.data) * 32 // 8, direction='write')
cmd.result = 'write_complete'
elif cmd.cmd_type == 'read':
data = self.ssd.read(cmd.lba)
self.interface.simulate_transfer(len(data) * 32 // 8, direction='read')
cmd.result = data
self.completion_queue.put(cmd)
cmd.completed.set()
except queue.Empty:
continue
def get_completion(self, timeout=1.0):
try:
cmd = self.completion_queue.get(timeout=timeout)
return cmd
except queue.Empty:
return None
def shutdown(self):
self.running = False
self.worker.join()