From 0063a8536c3bb01404aa88098c77810dd36e7202 Mon Sep 17 00:00:00 2001 From: Aaron Sinclair Date: Sat, 15 Nov 2025 03:29:57 -0800 Subject: [PATCH] Add comparison operator support for if conditions - Extend _emit_expr() to handle 'compare' type expressions - Map Python comparison ops (Gt, Lt, Eq, etc) to LLVM icmp predicates - Convert i1 result to i32 for compatibility - All conditional tests passing (3/3) --- .../llvm_codegen_signals.cpython-313.pyc | Bin 20618 -> 21423 bytes ritz/llvm_codegen_signals.py | 23 ++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/ritz/__pycache__/llvm_codegen_signals.cpython-313.pyc b/ritz/__pycache__/llvm_codegen_signals.cpython-313.pyc index db4317ae62bbfcd1a1fc6d4eefc94c217ac799b9..435bdd9ff92abb3f97211fca4e634d64f5d10b99 100644 GIT binary patch delta 996 zcmZvb%}*0S7{+(Dbhd?UOG~AtQrJX6h(RqMDt@EXVj-onY@!L+G_ckZXv=g}ASik< z#h9p!hA$J!MSIYQsZowK@#duj)Ve23IGg(M2RKvoVB#eE+xLB+cjlSd$=+QCFP{P9 zPlKVDA)|WG9_HI$8BGUDXs#j8Palix4s2K?AObDPMg5Tr3=@3KF!>1j7^|nMSh8%A+b9k?Wz#dK8uIBAQ2W ztC}tX);+3feNn|diu`2$gibgvga<}q!UPn;O^reg>Y-(xlqcjvV~P-V2{jX(phT%$ z&mjwukw{TWv7dmrDhLhHw3VQ~7~ghTPpdk*<-oNdQuQbty0RU@Xe=-ijHw(o4Mbx| zq6-uwIev9m2@s1oy-1-j@Pey_^#Z)+icjSX<_ERYeRCJr4YixLowHL9r;D^mG8_E(!i0caDF#%<;KL>yoIqj zXNMjRC9TQ9Wk;%ay}U8uA^MVY-nm$v@aFi^``&5qXWqHSJEf#1=}jI>jjeJk;~AJ4 z%M4}xJz23Y+tZ(|y0pOu@{n;<{dex4sgtYT)nl3K*{bdh-k&RTW_f42y>SVGX}ooK z7n~u-Mi?7fKe9VOdaLy-gpX+HG5&DsjboaI3l#r;dbEfa+nT`(oNXHb-gNWnxCYWT zb?=PThTprb;70n3y9E|j~#$}=}b8xScGKspzngkKbVO9}!NbD-4r046d-GvuScpt};qt(qx^S zZ!9UT$xLI6bQgNXLY`&~>JXHNd&lFVqlIl{G= znXzs184m--w9S7#d>9$qCqLkk;VCXD%FIiTFR3g@&EH()CBev8y1Coig&8P)!OxL# z@nj+Y2FB{mll|u~0-a+J7{Ug&t9^1;pgm*2GL2dG~pf-ntK-b)21KI$zsE8Tlv_l{Q>~L-niycH90TDbP0u-3HIBatBQ%ZAE W?TU^~&IvZ*uVZCY|HJ?y!HNJpifq0B diff --git a/ritz/llvm_codegen_signals.py b/ritz/llvm_codegen_signals.py index 46d640f..3f89362 100644 --- a/ritz/llvm_codegen_signals.py +++ b/ritz/llvm_codegen_signals.py @@ -247,6 +247,29 @@ class SignalLLVMIRGenerator: elif expr["type"] == "constant": # Return constant inline return str(expr["value"]) + elif expr["type"] == "compare": + # Handle comparison (e.g., count > 5) + left_var = self._emit_expr(expr["left"]) + right_var = self._emit_expr(expr["comparators"][0]) + + # Map Python comparison ops to LLVM icmp predicates + op_map = { + "Gt": "sgt", # signed greater than + "Lt": "slt", # signed less than + "GtE": "sge", # signed greater or equal + "LtE": "sle", # signed less or equal + "Eq": "eq", # equal + "NotEq": "ne", # not equal + } + + icmp_op = op_map.get(expr["op"], "eq") + result_var = self._new_var() + self.lines.append(f" %{result_var} = icmp {icmp_op} i32 %{left_var}, {right_var}") + + # Convert i1 to i32 for compatibility + result_i32 = self._new_var() + self.lines.append(f" %{result_i32} = zext i1 %{result_var} to i32") + return result_i32 else: # Unknown expression type return "0"