a
    ֳac)                     @   s   d dl T G dd dZdS )    )*c                   @   s   e Zd Zd9ddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8S ):
PythonEmitFc                 C   s6   || _ || _|| _|| _dg| _g | _i | _d| _d S )NSPa  RAM = {}
ROM = {}
IP = 0
HALT = False
BREAK = False
STEP = False
STACK = []
ERR_UNDERFLOW = ValueError("Stack underflow occured.")

def Get(addr):
	global RAM
	global STACK
	if addr < 0:
		if (-addr - 1) < len(STACK):
			return STACK[-addr - 1]
		else:
			return 0
	elif addr in RAM:
		return RAM[addr]
	else:
		return 0

def Set(addr, value):
	global RAM
	global STACK
	if addr < 0:
		while (-addr - 1) >= len(STACK):
			STACK += [0]
		STACK[-addr - 1] = value
	else:
		RAM[addr] = value

def Execute():
	global ROM
	global IP
	global HALT
	global BREAK
	global STEP

	BREAK = False
	while not HALT:
		if not IP in ROM:
			raise ValueError("Instruction pointer is out of bounds.")
		ROM[IP]()
		IP += 1
		if STEP or BREAK:
			return

)PrintURCLToConsolePrintRegisterStatesToConsole
SingleStepUseDebugger	Registers_LocalRegistersLabelsSource)selfuseDebuggerZprintURCLToConsoleZprintRegisterStatesToConsoleZ
singleStep r   h/media/fuse/drivefs-1ef8861adf0c828aef58e871a600f64f/root/Programming/Python/URCL/URCL-Toolkit/urclpy.py__init__   s    zPythonEmit.__init__c                 C   s,   |d krdS t |}t|dko*|d dkS )NFr   .)strlenr   valuer   r   r   IsLabel0   s    zPythonEmit.IsLabelc                 C   sl   t |}|d krdS |dkr`t|dkr`|d dkr`zt|dt| }W dS    Y dS 0 n|dkS d S )NFR0r   R   Tr   )r   r   intr   r   r   r   
IsRegister6   s     
zPythonEmit.IsRegisterc                 C   s   |  |jr*|j| jvr*|  j|jg7  _|  |jrT|j| jvrT|  j|jg7  _|  |jr~|j| jvr~|  j|jg7  _d S N)r   OperandAr	   OperandBOperandC)r   instr   r   r   IncludeInstructionRegistersC   s    z&PythonEmit.IncludeInstructionRegistersc                 C   s   d|dt |  S )NZLABEL_r   )r   )r   labelr   r   r   GetLabelNameK   s    zPythonEmit.GetLabelNamec                 C   s    t |ddddddS )N\z\\"z\"
z\n)r   replacer   textr   r   r   	StringifyN   s    zPythonEmit.Stringifyc                 C   sb   t |dkrT| |r<|  j| |d t| d 7  _q^| dt| d  n
| d d S )Nr    = r'   r&   z" is not a valid label.zEmpty label was ignored.)r   r   r   r$   r   	EmitErrorEmitWarning)r   r#   positionr   r   r   EmitLabelCodeQ   s
    
&zPythonEmit.EmitLabelCodec                 C   s   |  j dt| d 7  _ d S )Nz	raise r'   r   r   )r   Zexr   r   r   EmitExceptionZ   s    zPythonEmit.EmitExceptionc                 C   s~   ||kr<|  j dt| d t| d t| d 7  _ n>|  j dt| d t| d t| d t| d 7  _ d S )N	 z= r'   r,   r1   r   targetaopbr   r   r   EmitOperation]   s    4zPythonEmit.EmitOperationc                 C   s   |  ||d| d S )N )r:   r   r6   sourcer   r   r   EmitAssignmentc   s    zPythonEmit.EmitAssignmentc                 C   s6   |  j dt| d t| d t| d 7  _ d S )Nz	if r4   z:
	r1   )r   r7   r8   r9   r   r   r   EmitConditionalf   s    zPythonEmit.EmitConditionalc                 C   s"   |  ||| | d|dd d S )NIP-r   )r?   r:   r5   r   r   r   
EmitBranchi   s    zPythonEmit.EmitBranchc                 C   s*   |  j dt| d t| d 7  _ d S )Nr3   z = Get()
r1   )r   r6   addressr   r   r   EmitLoadm   s    zPythonEmit.EmitLoadc                 C   s*   |  j dt| d t| d 7  _ d S )N	Set(z, rC   r1   )r   rD   r=   r   r   r   	EmitStorep   s    zPythonEmit.EmitStorec                 C   s*   |  j dt| d t| d 7  _ d S )NrF   z, Get())
r1   r<   r   r   r   EmitCopys   s    zPythonEmit.EmitCopyc                 C   s    |  dddd | d| d S )Nr   rA   r   )r:   rG   r   r=   r   r   r   EmitPushv   s    zPythonEmit.EmitPushc                 C   s8   |  ddd | d | |d | dddd d S )Nr   >=r   ERR_UNDERFLOW+r   )r?   r2   rE   r:   r   r6   r   r   r   EmitPopz   s    
zPythonEmit.EmitPopc                 C   s2   |  |r| | |  jdt| d 7  _d S )Nz	global r'   )r   UseRegisterr   r   rO   r   r   r   
EmitGlobal   s    

zPythonEmit.EmitGlobalc                 C   s    |  j d| | d 7  _ d S )N	print("z")
)r   r+   r)   r   r   r   	EmitPrint   s    zPythonEmit.EmitPrintc                 C   s,   |  j d| | d t| d 7  _ d S )NrS   z = " + str(rH   )r   r+   r   rJ   r   r   r   EmitPrintValue   s    zPythonEmit.EmitPrintValuec                 C   s*   |  j dt| d 7  _ td|  d S )Nz
#WARNING: r'   z	WARNING: r   r   printr)   r   r   r   r.      s    zPythonEmit.EmitWarningc                 C   s*   |  j dt| d 7  _ td|  d S )Nz#ERROR: r'   zERROR: rV   r)   r   r   r   r-      s    zPythonEmit.EmitErrorc                 C   s
   g | _ d S r   r
   )r   r   r   r   ClearRegisters   s    zPythonEmit.ClearRegistersc                 C   s   || j vr|  j |g7  _ d S r   rX   )r   regr   r   r   rQ      s    
zPythonEmit.UseRegisterc                 C   sP   |  |r | | | | n,| |r@| |}| | n|tkrLd}|S )Nr   )r   rR   rQ   r   r$   ZERO)r   operandr   r   r   ResolveOperand   s    



zPythonEmit.ResolveOperandc           
      C   s  |    t|}|  jdt| d 7  _| jrB| dt|  | |j|_| |j|_| |j|_| j	rt
| jdkr| d | jD ]}| | q| jr|  jd7  _|j}|jd k}|jd ko|jd k}|jd ko|jd ko|jd k}|jd ko|jd ko|jd k}	|r|tkr*n|tkrL| d | dd nb|tkrn| d	 | d	d n@|tkr| d
 | d | d
 n| dt| d  n|r|tkr| d | |j n|tkr| d | d | |j nz|tkr.| d
 | d
|jdd nR|tkrj| d
 | d | d
 | d
|jdd n| dt| d  n|r$|tkr| |j|j q|tkr|  |j|j q|t!ks|t"kr| |j|jd|j q|t#kr| |j|jdd q|t$kr6| |j|jdd n|t%krV| |j|jdd n|t&krv| |j|jdd n|t'kr| |jdt|j  n|t(kr| d
 | )|j|jdd n\|t*kr| d
 | )|j|jdd n2|t+kr
| ,|j|j n| dt| d  nf|	rt|t-krN| |j|jd|j q|t.krr| |j|jd|j q|t/kr| |j|jd|j q|t0kr| |j|jd|j q|t1kr| |j|jd|j q|t2kr| |j|jd|j q|t3kr&| |j|jd|j q|t4krJ| |j|jd|j q|t5krn| |j|jd|j q|t6kr| |j|jd|j n|t7kr| )|j|jd|j n|t8kr| )|j|jd|j n|t9kr| )|j|jd |j n||t:kr| )|j|jd!|j nZ|t;kr:| )|j|jd"|j n8|t<kr\| )|j|jd#|j n| dt| d$  n| d%t| d&  | j	rt
| jdkr| d' | jD ]}| | q|  jd(t| d) | =| d* t| d+ t| d, 7  _d S )-Nz	def INST_z():
r'   r   zPre-operation registers:z$	input("Press enter to execute...")
ZHALTTrueZBREAKr@   r   r&   z" does not take zero operands.rM   rA   r   z" does not take one operand.r;   z<<z>>rN   ~z==z!=z" does not take two operands.r   z//%&|^<>z<=rL   z" does not take three operands.zInvalid instruction "z".zPost-operation registers:z	return
INST_z.Source = "z"
ROM[z	] = INST_z

)>rY   r   r   r   rT   r]   r   r   r    r   r   r
   rU   r   	OperationNOPHLTrR   r>   BRKRETrP   r-   PSHrK   POPJMPr:   CALLODrE   STRrG   MOVIMMLSHRSHINCDECNOTBRZrB   BNZCPYrI   ADDSUBMLTDIVMODANDORXORBSLBSRBREBNEBRLBRGBLEBGEr+   )
r   r!   r/   ZoriginalSourcerZ   r8   ZisZeroOperandZisOneOperandZisTwoOperandZisThreeOperandr   r   r   EmitInstructionCode   s    


"
















































zPythonEmit.EmitInstructionCodec                 C   s   |j D ]}| | q| jD ]}|  jt|d 7  _q|jD ] }|j| D ]}| || qLq>|  jd7  _tt|j D ]}| 	|j | | q|| j
r| jS | jd S d S )Nz = 0
r'   z	Execute())Instructionsr"   r	   r   r   r   r0   ranger   r   r   )r   emitterr!   rZ   r/   r#   r   r   r   Emit)  s    


zPythonEmit.EmitN)FFFF)__name__
__module____qualname__r   r   r   r"   r$   r+   r0   r2   r:   r>   r?   rB   rE   rG   rI   rK   rP   rR   rT   rU   r.   r-   rY   rQ   r]   r   r   r   r   r   r   r      s8   
,	 r   N)urclr   r   r   r   r   <module>   s   