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 {};
