edacation
Version:
Library and CLI for interacting with Yosys and nextpnr.
351 lines (350 loc) • 14.5 kB
TypeScript
import { type ProjectConfiguration, TargetConfiguration, TargetOptionTypes, WorkerId } from './configuration.js';
import { Device, Family, Vendor } from './devices.js';
type Primitive = string | number | boolean | bigint | symbol | null | undefined | Date | RegExp | ((...args: unknown[]) => unknown);
type PathArray<T> = T extends Primitive ? never : {
[K in Extract<keyof T, string>]: T[K] extends Primitive | unknown[] ? [K] : [K] | [K, ...PathArray<T[K]>];
}[Extract<keyof T, string>];
type PathArrayValue<T, P extends readonly string[]> = P extends [] ? T : P extends [infer K extends string, ...infer R extends string[]] ? K extends keyof T ? PathArrayValue<T[K], R> : unknown : unknown;
export type ProjectEvent = 'meta' | 'inputFiles' | 'outputFiles' | 'configuration';
type EventCallback = (project: Project, events: ProjectEvent[]) => void;
export interface ProjectInputFileState {
path: string;
type: 'design' | 'testbench' | 'pinconfig';
}
export declare class ProjectInputFile {
private _project;
private _path;
private _type;
constructor(_project: Project, _path: ProjectInputFileState['path'], _type: ProjectInputFileState['type']);
get path(): ProjectInputFileState['path'];
get type(): ProjectInputFileState['type'];
set type(type: ProjectInputFileState['type']);
serialize(): ProjectInputFileState;
static deserialize(project: Project, data: ProjectInputFileState | string, ..._args: unknown[]): ProjectInputFile;
copy(project: Project): ProjectInputFile;
}
export interface ProjectOutputFileState {
path: string;
targetId: string | null;
stale: boolean;
}
export declare class ProjectOutputFile {
private _project;
private _path;
private _targetId;
private _stale;
constructor(_project: Project, _path: ProjectOutputFileState['path'], _targetId?: ProjectOutputFileState['targetId'], _stale?: ProjectOutputFileState['stale']);
get path(): ProjectOutputFileState['path'];
get targetId(): ProjectOutputFileState['targetId'];
set targetId(id: ProjectOutputFileState['targetId']);
get target(): ProjectTarget | null;
get stale(): ProjectOutputFileState['stale'];
set stale(isStale: ProjectOutputFileState['stale']);
serialize(): ProjectOutputFileState;
static deserialize(project: Project, data: ProjectOutputFileState | string, ..._args: unknown[]): ProjectOutputFile;
copy(project: Project): ProjectOutputFile;
}
export declare class ProjectTarget {
private _project;
private _data;
constructor(_project: Project, _data: TargetConfiguration);
get id(): string;
set id(newId: string);
get name(): string;
set name(newName: string);
get isActive(): boolean;
setActive(): void;
getFile(...parts: string[]): string;
get vendorId(): string;
get availableVendors(): Record<string, Vendor>;
get vendor(): Vendor | undefined;
setVendor(vendorId: string): void;
get familyId(): string;
get availableFamilies(): Record<string, Family>;
get family(): Family | undefined;
setFamily(familyId: string): void;
get deviceId(): string;
get availableDevices(): Record<string, Device>;
get device(): Device | undefined;
setDevice(deviceId: string): void;
get packageId(): string;
get availablePackages(): Record<string, string>;
get package(): string | undefined;
setPackage(packageId: string): void;
get config(): TargetConfiguration;
setConfig<P extends PathArray<TargetConfiguration>>(path: P, value: PathArrayValue<TargetConfiguration, P>): void;
getEffectiveOptions<W extends WorkerId>(workerId: W): TargetOptionTypes[W];
getEffectiveTextConfig(workerId: WorkerId, configId: string, generated: string[], parse?: (values: string[]) => string[]): string[];
update(updates: Partial<TargetConfiguration>): void;
serialize(): TargetConfiguration;
}
export interface ProjectState {
name: string;
inputFiles: ProjectInputFileState[] | string[];
outputFiles: ProjectOutputFileState[] | string[];
configuration: ProjectConfiguration;
}
export declare class Project {
private name;
private inputFiles;
private outputFiles;
private configuration;
private eventCallback?;
private batchedEvents;
private batchCounter;
constructor(name: string, inputFiles?: ProjectInputFileState[] | string[], outputFiles?: ProjectOutputFileState[] | string[], configuration?: ProjectConfiguration, eventCallback?: EventCallback);
getName(): string;
setName(name: string): void;
getInputFiles(): ProjectInputFile[];
hasInputFile(filePath: string): boolean;
getInputFile(filePath: string): ProjectInputFile | null;
addInputFiles(files: {
path: string;
type?: ProjectInputFileState['type'];
}[]): void;
removeInputFiles(filePaths: string[]): void;
getOutputFiles(): ProjectOutputFile[];
hasOutputFile(filePath: string): boolean;
getOutputFile(filePath: string): ProjectOutputFile | null;
addOutputFiles(files: {
path: string;
targetId: string;
}[]): void;
removeOutputFiles(filePaths: string[]): void;
expireOutputFiles(): void;
setTopLevelModule(targetId: string, module: string): void;
setActiveTestbenchPath(targetId: string, testbenchPath?: string): void;
getActiveTestbenchPath(targetId: string): string | undefined;
setActivePinConfigPath(targetId: string, pinConfigPath?: string): void;
getActivePinConfigPath(targetId: string): string | undefined;
setInputFileType(filePath: string, type: ProjectInputFile['type']): void;
getTargets(): ProjectTarget[];
hasTarget(id: string): boolean;
getTarget(id: string): ProjectTarget | null;
getActiveTarget(): ProjectTarget | null;
setActiveTarget(id: string | null): void;
addTarget(id?: string, config?: Omit<TargetConfiguration, 'id'>): ProjectTarget;
removeTarget(id: string): void;
updateTarget(id: string, updates: Partial<TargetConfiguration>): void;
getConfiguration(): {
targets: {
id: string;
name: string;
vendor: string;
family: string;
device: string;
package: string;
directory?: string | undefined;
yosys?: {
inputFiles?: {
useGenerated: boolean;
values: string[];
useDefault: boolean;
} | undefined;
outputFiles?: {
useGenerated: boolean;
values: string[];
useDefault: boolean;
} | undefined;
synthPrepareCommands?: {
useGenerated: boolean;
values: string[];
useDefault: boolean;
} | undefined;
synthCommands?: {
useGenerated: boolean;
values: string[];
useDefault: boolean;
} | undefined;
rtlCommands?: {
useGenerated: boolean;
values: string[];
useDefault: boolean;
} | undefined;
options?: {
optimize?: boolean | undefined;
topLevelModule?: string | undefined;
synthArguments?: string | undefined;
} | undefined;
} | undefined;
nextpnr?: {
inputFiles?: {
useGenerated: boolean;
values: string[];
useDefault: boolean;
} | undefined;
outputFiles?: {
useGenerated: boolean;
values: string[];
useDefault: boolean;
} | undefined;
arguments?: {
useGenerated: boolean;
values: string[];
useDefault: boolean;
} | undefined;
options?: {
placedSvg?: boolean | undefined;
routedSvg?: boolean | undefined;
routedJson?: boolean | undefined;
reportJson?: boolean | undefined;
pinConfigFile?: string | undefined;
} | undefined;
} | undefined;
iverilog?: {
inputFiles?: {
useGenerated: boolean;
values: string[];
useDefault: boolean;
} | undefined;
outputFiles?: {
useGenerated: boolean;
values: string[];
useDefault: boolean;
} | undefined;
arguments?: {
useGenerated: boolean;
values: string[];
useDefault: boolean;
} | undefined;
options?: {
testbenchFile?: string | undefined;
} | undefined;
} | undefined;
flasher?: {
inputFiles?: {
useGenerated: boolean;
values: string[];
useDefault: boolean;
} | undefined;
outputFiles?: {
useGenerated: boolean;
values: string[];
useDefault: boolean;
} | undefined;
packerArguments?: {
useGenerated: boolean;
values: string[];
useDefault: boolean;
} | undefined;
flasherArguments?: {
useGenerated: boolean;
values: string[];
useDefault: boolean;
} | undefined;
options?: {
board?: string | undefined;
programToFlash?: boolean | undefined;
} | undefined;
} | undefined;
}[];
defaults?: {
yosys?: {
inputFiles?: {
useGenerated: boolean;
values: string[];
} | undefined;
outputFiles?: {
useGenerated: boolean;
values: string[];
} | undefined;
synthPrepareCommands?: {
useGenerated: boolean;
values: string[];
} | undefined;
synthCommands?: {
useGenerated: boolean;
values: string[];
} | undefined;
rtlCommands?: {
useGenerated: boolean;
values: string[];
} | undefined;
options?: {
optimize?: boolean | undefined;
topLevelModule?: string | undefined;
synthArguments?: string | undefined;
} | undefined;
} | undefined;
nextpnr?: {
inputFiles?: {
useGenerated: boolean;
values: string[];
} | undefined;
outputFiles?: {
useGenerated: boolean;
values: string[];
} | undefined;
arguments?: {
useGenerated: boolean;
values: string[];
} | undefined;
options?: {
placedSvg?: boolean | undefined;
routedSvg?: boolean | undefined;
routedJson?: boolean | undefined;
reportJson?: boolean | undefined;
pinConfigFile?: string | undefined;
} | undefined;
} | undefined;
iverilog?: {
inputFiles?: {
useGenerated: boolean;
values: string[];
} | undefined;
outputFiles?: {
useGenerated: boolean;
values: string[];
} | undefined;
arguments?: {
useGenerated: boolean;
values: string[];
} | undefined;
options?: {
testbenchFile?: string | undefined;
} | undefined;
} | undefined;
flasher?: {
inputFiles?: {
useGenerated: boolean;
values: string[];
} | undefined;
outputFiles?: {
useGenerated: boolean;
values: string[];
} | undefined;
packerArguments?: {
useGenerated: boolean;
values: string[];
} | undefined;
flasherArguments?: {
useGenerated: boolean;
values: string[];
} | undefined;
options?: {
board?: string | undefined;
programToFlash?: boolean | undefined;
} | undefined;
} | undefined;
} | undefined;
activeTargetId?: string | undefined;
};
updateConfiguration(configuration: Partial<ProjectConfiguration>): void;
protected importFromProject(other: Project, doTriggerEvent?: boolean): void;
triggerInputFilesChanged(): void;
triggerOutputFilesChanged(): void;
triggerConfigurationChanged(): void;
protected emitEvents(...events: ProjectEvent[]): void;
protected batchEvents<T>(func: () => T, ...events: ProjectEvent[]): T;
protected ignoreEvents<T>(func: () => T): T;
protected static emitsEvents(...events: ProjectEvent[]): <T>(_target: object, _propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>) => TypedPropertyDescriptor<T> | void;
protected makeCorrections(): boolean;
private correctTestbenchPath;
private correctPinconfigPaths;
correctActiveTarget(): boolean;
static serialize(project: Project): ProjectState;
static deserialize(data: ProjectState, ..._args: unknown[]): Project;
static loadFromData(rawData: Uint8Array): Project;
static storeToData(project: Project): Uint8Array;
}
export {};