import { Mnemonic } from "../syntax";
import { InstructionStatement } from "../parse/nodes";
import { Variables } from "../parse/evaluate";
/**
 * Timing vector:
 * cycles, reads, writes
 */
export declare type Timing = [number, number, number];
/**
 * Result of timing lookup for an instruction
 */
export interface InstructionTiming {
    values: Timing[];
    labels: string[];
    calculation?: Calculation;
}
/**
 * Describes how the timings are calculated
 */
export interface Calculation {
    base: Timing[];
    ea?: Timing;
    multiplier?: Timing;
    /** Known number or range */
    n?: number | [number, number];
}
export declare function popCount(x: number): number;
/**
 * Look up timing information for a parsed instruction statement
 */
export declare function instructionTimings(statement: InstructionStatement, vars: Variables): InstructionTiming | null;
/**
 * Convert timing to string per the 68000 documentation
 *
 * clock(read/write)
 */
export declare const formatTiming: (timing: Timing) => string;
/**
 * Add two timing vectors
 */
export declare function addTimings(a: Timing, b: Timing): Timing;
/**
 * Multiply a timing vector by a scalar value
 */
export declare function multiplyTiming(t: Timing, scalar: number): Timing;
/**
 * Calculate timing n value from register range used in MOVEM
 */
export declare function rangeN(range: string): number;
/**
 * Get text labels for multiple timings
 */
export declare function timingLabels(op: Mnemonic): string[];
