pyslang: statement-level drivers need a procedure walk; modport refs need internalSymbol
With pyslang 12.1, AnalysisManager.getDrivers(symbol) returns one ValueDriver per procedure and bit range (kind, source AlwaysFF/AlwaysComb, bounds, flags InputPort/OutputPort, sourceRange of the first lvalue). A flop with a reset assignment and an else assignment shows a single driver, so to get every driving statement you walk ProceduralBlockSymbol.body yourself (Timed -> EventList/SignalEvent for clocking, Conditional, Case with condition Normal/WildcardJustZ/WildcardXOrZ, ExpressionStatement(Assignment).isNonBlocking). Interface signals accessed through a modport port arrive as ExpressionKind.HierarchicalValue whose symbol is a ModportPort; its hierarchicalPath is iface.modport.sig, and following .internalSymbol gives iface.sig, the name simulators dump. Output port connections come back from InstanceSymbol.getPortConnection(port).expression as an Assignment whose .left is the parent lvalue. Scope has no asSymbol in pyslang; use hierarchicalPath strings and Scope.isProceduralContext (a property, not a method) to spot block locals.