1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- function substitute_indexing(expr :: StarpuExpr)
- function func_to_run(x :: StarpuExpr)
- if !isa(x, StarpuExprRef)
- return x
- end
- if !isa(x.ref, StarpuExprVar)
- error("Only variable indexing is allowed") #TODO allow more ?
- end
- nb_indexes = length(x.indexes)
- if (nb_indexes >= 3)
- error("Indexing with more than 2 indexes is not allowed") # TODO : blocks
- end
- if (nb_indexes == 0)
- return x
- elseif nb_indexes == 1
- new_index = StarpuExprCall(:-, [x.indexes[1], StarpuExprValue(1)]) #TODO : add field "offset" from STARPU_VECTOR_GET interface
- #TODO : detect when it is a matrix used with one index only
- return StarpuExprRef(x.ref, [new_index])
- elseif nb_indexes == 2
- var_name = String(x.ref.name)
- if !ismatch(r"ptr_", var_name) || isempty(var_name[5:end])
- error("Invalid variable ($var_name) for multiple index dereferencing")
- end
- var_id = var_name[5:end]
- ld_name = Symbol("ld_", var_id) # TODO : check if this variable is legit (var_name must refer to a matrix)
- new_index = x.indexes[2]
- new_index = StarpuExprCall(:(-), [new_index, StarpuExprValue(1)])
- new_index = StarpuExprCall(:(*), [new_index, StarpuExprVar(ld_name)])
- new_index = StarpuExprCall(:(+), [x.indexes[1], new_index])
- new_index = StarpuExprCall(:(-), [new_index, StarpuExprValue(1)])
- return StarpuExprRef(x.ref, [new_index])
- end
- end
- return apply(func_to_run, expr)
- end
|