8bitworkshop/src/common/hdl/hdltypes.ts

197 lines
4.4 KiB
TypeScript

export interface HDLLogicType extends HDLSourceObject {
left: number;
right: number;
}
export interface HDLUnpackArray extends HDLSourceObject {
subtype: HDLDataType;
low: HDLConstant;
high: HDLConstant;
}
export interface HDLNativeType extends HDLSourceObject {
jstype: string;
}
export type HDLDataType = HDLLogicType | HDLUnpackArray | HDLNativeType;
export function isLogicType(arg:any): arg is HDLLogicType {
return typeof arg.left === 'number' && typeof arg.right === 'number';
}
export function isArrayType(arg:any): arg is HDLUnpackArray {
return arg.subtype != null && arg.low != null && arg.high != null;
}
export class HDLFile {
id: string;
filename: string;
isModule: boolean;
}
export interface HDLSourceLocation {
file: HDLFile;
line: number;
col?: number;
end_line?: number;
end_col?: number;
}
export interface HDLSourceObject {
$loc?: HDLSourceLocation;
}
export interface HDLDataTypeObject extends HDLSourceObject {
dtype: HDLDataType;
}
export interface HDLModuleDef extends HDLSourceObject {
name: string;
origName: string;
blocks: HDLBlock[];
instances: HDLInstanceDef[];
vardefs: { [id:string] : HDLVariableDef };
}
export interface HDLVariableDef extends HDLDataTypeObject {
name: string;
origName: string;
isInput: boolean;
isOutput: boolean;
isParam: boolean;
constValue?: HDLConstant;
initValue?: HDLBlock;
}
export function isVarDecl(arg:any): arg is HDLVariableDef {
return typeof arg.isParam !== 'undefined';
}
export interface HDLConstant extends HDLDataTypeObject {
cvalue: number;
}
export function isConstExpr(arg:any): arg is HDLConstant {
return typeof arg.cvalue === 'number';
}
export interface HDLHierarchyDef extends HDLSourceObject {
name: string;
module: HDLModuleDef;
parent: HDLHierarchyDef;
children: HDLHierarchyDef[];
}
export interface HDLInstanceDef extends HDLSourceObject {
name: string;
origName: string;
module: HDLModuleDef;
ports: HDLPort[];
}
export interface HDLVarRef extends HDLDataTypeObject {
refname: string;
//TODO? vardef: HDLVariableDef;
}
export function isVarRef(arg:any): arg is HDLVarRef {
return arg.refname != null;
}
export interface HDLUnop extends HDLDataTypeObject {
op: string;
left: HDLExpr;
}
export interface HDLExtendop extends HDLUnop {
width: number;
widthminv: number;
}
export function isUnop(arg:any): arg is HDLUnop {
return arg.op != null && arg.left != null && arg.right == null;
}
export interface HDLBinop extends HDLUnop {
right: HDLExpr;
}
export function isBinop(arg:any): arg is HDLBinop {
return arg.op != null && arg.left != null && arg.right != null && arg.cond == null;
}
export interface HDLTriop extends HDLBinop {
cond: HDLExpr;
}
export function isTriop(arg:any): arg is HDLTriop {
return arg.op != null && arg.cond != null;
}
export interface HDLWhileOp extends HDLDataTypeObject {
op: 'while';
precond: HDLExpr;
loopcond: HDLExpr;
body: HDLExpr;
inc: HDLExpr;
}
export function isWhileop(arg:any): arg is HDLWhileOp {
return arg.op === 'while' && arg.loopcond != null;
}
export interface HDLBlock extends HDLSourceObject {
blocktype: string;
name: string;
exprs: HDLExpr[];
}
export function isBlock(arg:any): arg is HDLBlock {
return arg.blocktype != null;
}
export interface HDLAlwaysBlock extends HDLBlock {
senlist: HDLSensItem[];
}
export interface HDLSensItem extends HDLSourceObject {
edgeType : "POS" | "NEG";
expr: HDLExpr;
}
export interface HDLPort extends HDLSourceObject {
name: string;
expr: HDLExpr;
}
export interface HDLFuncCall extends HDLSourceObject {
funcname: string;
args: HDLExpr[];
}
export function isFuncCall(arg:any): arg is HDLFuncCall {
return typeof arg.funcname === 'string';
}
export interface HDLArrayItem {
index: number;
expr: HDLExpr;
}
export function isArrayItem(arg:any): arg is HDLArrayItem {
return typeof arg.index === 'number' && arg.expr != null;
}
export type HDLExpr = HDLVarRef | HDLUnop | HDLBinop | HDLTriop | HDLBlock | HDLVariableDef | HDLFuncCall | HDLConstant;
export interface HDLUnit {
files: { [id: string]: HDLFile };
dtypes: { [id: string]: HDLDataType };
modules: { [id: string]: HDLModuleDef };
hierarchies: { [id: string]: HDLHierarchyDef };
}
export type HDLValue = number | Uint8Array | Uint16Array | Uint32Array | HDLValue[];