From 66eb918a13b6607cc7bb615350a0e26f3670cd54 Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Fri, 15 May 2020 10:52:11 -0700 Subject: factored out the common code of makefiles --- rules.mk | 25 ++++------ share/paths.mk | 15 ++++++ share/pop.mk | 4 ++ share/push.mk | 3 ++ sys/libbio/io/rules.mk | 28 ++---------- sys/libbio/rules.mk | 27 ++--------- sys/libc/rules.mk | 27 ++--------- sys/libmath/gen2.py | 122 ++++++++++++++++++++++++++++--------------------- sys/libmath/rules.mk | 32 ++----------- sys/libn/rules.mk | 38 ++------------- sys/rules.mk | 3 ++ 11 files changed, 128 insertions(+), 196 deletions(-) create mode 100644 share/paths.mk create mode 100644 share/pop.mk create mode 100644 share/push.mk diff --git a/rules.mk b/rules.mk index ce74da2..ff12fdb 100644 --- a/rules.mk +++ b/rules.mk @@ -1,7 +1,6 @@ # Standard housekeeping -.PHONY: all debug release clean install +.PHONY: all debug release clean target install .SUFFIXES: -.SUFFIXES: .s .c .o all: targets @@ -18,6 +17,7 @@ DEPS := LIBS := BINS := +TSTS := # Iterate through directory tree DIR := sys @@ -25,40 +25,33 @@ include $(DIR)/rules.mk # Generic rules %.a: %.o - @echo AR $@ $^ + @echo AR $^ @$(ARCHIVE) $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c - @echo CC $^ + @echo CC $^ @$(COMPILE) $(OBJ_DIR)/%.o: $(SRC_DIR)/%.s - @echo AS $^ + @echo AS $^ @$(ASSEMBLE) %: %.o - @echo CC $^ + @echo CC $^ @$(LINK) $(OBJ_DIR)/%: $(SRC_DIR)/%.c - @echo CC $^ + @echo CC $^ @$(COMPLNK) -.PHONY: targets -targets: $(LIBS) $(BINS) +targets: $(LIBS) $(BINS) $(TSTS) -.PHONY: database -database: $(LIBS) $(BINS) - gentags - ctags -R sys - -.PHONY: clean clean: rm -f $(OBJS) rm -f $(DEPS) rm -f $(LIBS) rm -f $(BINS) + rm -f $(TSTS) -.PHONY: install install: targets echo "TODO" diff --git a/share/paths.mk b/share/paths.mk new file mode 100644 index 0000000..e2cee4f --- /dev/null +++ b/share/paths.mk @@ -0,0 +1,15 @@ +OBJS_$(d) := $(SRCS_$(d):.c=.o) +OBJS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(OBJS_$(d))) +DEPS_$(d) := $(OBJS_$(d):.o=.d) + +OBJS := $(OBJS) $(OBJS_$(d)) +DEPS := $(DEPS) $(DEPS_$(d)) + +LIBS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(LIBS_$(d))) +LIBS := $(LIBS) $(LIBS_$(d)) + +BINS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(BINS_$(d))) +BINS := $(BINS) $(BINS_$(d)) + +TSTS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(TSTS_$(d))) +TSTS := $(TSTS) $(TSTS_$(d)) diff --git a/share/pop.mk b/share/pop.mk new file mode 100644 index 0000000..cee9e65 --- /dev/null +++ b/share/pop.mk @@ -0,0 +1,4 @@ +-include $(DEPS_$(d)) + +d := $(DIRSTACK_$(SP)) +SP := $(basename $(SP)) diff --git a/share/push.mk b/share/push.mk new file mode 100644 index 0000000..4ea661d --- /dev/null +++ b/share/push.mk @@ -0,0 +1,3 @@ +SP := $(SP).x +DIRSTACK_$(SP) := $(d) +d := $(DIR) diff --git a/sys/libbio/io/rules.mk b/sys/libbio/io/rules.mk index 9ef6d00..a4277fc 100644 --- a/sys/libbio/io/rules.mk +++ b/sys/libbio/io/rules.mk @@ -1,31 +1,14 @@ -# ---- Push on stack ---- -SP := $(SP).x -DIRSTACK_$(SP) := $(d) -d := $(DIR) +include share/push.mk # Iterate through subdirectory tree # Local sources SRCS_$(d) := $(wildcard $(d)/*.c) -OBJS_$(d) := $(SRCS_$(d):.c=.o) -OBJS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(OBJS_$(d))) -DEPS_$(d) := $(OBJS_$(d):.o=.d) - -OBJS := $(OBJS) $(OBJS_$(d)) -DEPS := $(DEPS) $(DEPS_$(d)) - -# Local targets LIBS_$(d) := -LIBS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(LIBS_$(d))) -LIBS := $(LIBS) $(LIBS_$(d)) - BINS_$(d) := -BINS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(BINS_$(d))) -BINS := $(BINS) $(BINS_$(d)) +TSTS_$(d) := -# Local rules -# $(LIBS_$(d)) = TCFLAGS := -# $(LIBS_$(d)) = TCINCS := +include share/paths.mk $(LIBS_$(d)): $(OBJS_$(d)) $(ARCHIVE) @@ -35,7 +18,4 @@ $(BINS_$(d)): $(OBJS_$(d)) $(LINK) # ---- Pop off stack ---- --include $(DEPS_$(d)) - -d := $(DIRSTACK_$(SP)) -SP := $(basename $(SP)) +include share/pop.mk diff --git a/sys/libbio/rules.mk b/sys/libbio/rules.mk index ff71746..fbba7df 100644 --- a/sys/libbio/rules.mk +++ b/sys/libbio/rules.mk @@ -1,7 +1,4 @@ -# ---- Push on stack ---- -SP := $(SP).x -DIRSTACK_$(SP) := $(d) -d := $(DIR) +include share/push.mk # Iterate through subdirectory tree DIR := $(d)/io @@ -9,21 +6,11 @@ include $(DIR)/rules.mk # Local sources SRCS_$(d) := $(wildcard $(d)/*.c) -OBJS_$(d) := $(SRCS_$(d):.c=.o) -OBJS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(OBJS_$(d))) -DEPS_$(d) := $(OBJS_$(d):.o=.d) - -OBJS := $(OBJS) $(OBJS_$(d)) -DEPS := $(DEPS) $(DEPS_$(d)) - -# Local targets LIBS_$(d) := $(d)/libbio.a -LIBS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(LIBS_$(d))) -LIBS := $(LIBS) $(LIBS_$(d)) +BINS_$(d) := +TSTS_$(d) := $(d)/test $(d)/simulate -BINS_$(d) := $(d)/test $(d)/simulate -BINS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(BINS_$(d))) -BINS := $(BINS) $(BINS_$(d)) +include share/paths.mk # Local rules # $(LIBS_$(d)) = TCFLAGS := @@ -38,8 +25,4 @@ $(BINS_$(d)): $(LIBS_$(d)) $(OBJ_DIR)/libn/libn.a @echo BIN $@ @$(LINK) -# ---- Pop off stack ---- --include $(DEPS_$(d)) - -d := $(DIRSTACK_$(SP)) -SP := $(basename $(SP)) +include share/pop.mk diff --git a/sys/libc/rules.mk b/sys/libc/rules.mk index 36cf1a7..f017738 100644 --- a/sys/libc/rules.mk +++ b/sys/libc/rules.mk @@ -1,42 +1,23 @@ -# ---- Push on stack ---- -SP := $(SP).x -DIRSTACK_$(SP) := $(d) -d := $(DIR) +include share/push.mk # Iterate through subdirectory tree # Local sources SRCS_$(d) := $(wildcard $(d)/*.c) -OBJS_$(d) := $(SRCS_$(d):.c=.o) -OBJS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(OBJS_$(d))) -DEPS_$(d) := $(OBJS_$(d):.o=.d) - -OBJS := $(OBJS) $(OBJS_$(d)) -DEPS := $(DEPS) $(DEPS_$(d)) - -# Local targets LIBS_$(d) := $(d)/libc.a -LIBS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(LIBS_$(d))) -LIBS := $(LIBS) $(LIBS_$(d)) - BINS_$(d) := -BINS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(BINS_$(d))) -BINS := $(BINS) $(BINS_$(d)) + +include share/paths.mk # Local rules # $(LIBS_$(d)) = TGTINCS := # $(LIBS_$(d)) = TGTLIBS := $(LIBS_$(d)): TCFLAGS := -ffreestanding -fno-builtin -nostdlib - $(LIBS_$(d)): $(OBJS_$(d)) $(ARCHIVE) $(BINS_$(d)): $(OBJ_DIR)/libn/test.o $(LINK) -# ---- Pop off stack ---- --include $(DEPS_$(d)) - -d := $(DIRSTACK_$(SP)) -SP := $(basename $(SP)) +include share/pop.mk diff --git a/sys/libmath/gen2.py b/sys/libmath/gen2.py index 6ce2a12..2afbe1d 100755 --- a/sys/libmath/gen2.py +++ b/sys/libmath/gen2.py @@ -104,40 +104,50 @@ def DoubleLoop(top, bot, Kernel, Preamble=[], Postamble=[]): ]) ) -def TriangularLoop(top, bot, Kernel, Preamble=[], Postamble=[], upper=True): - def Step(it, inc): - if inc == 1: - return Inc(it) - else: - return AddSet(it, I(inc)) - - def Finish(j): - if j == 0: - return For(None, LE(bot.it, top.it), Inc(bot.it), - Block(*[func for i in range(j, top.inc) for func in Kernel(top.it, bot.it, i, 1)]) - ) +def TriangularLoop(top, bot, Kernel, Preamble=[], Postamble=lambda i: None, upper=True): + # --------------------------------------------------------------- + # Helper functions + + def Finish(j, upper=False): + if upper: + if j == 0: + return Block(For(None, GT(bot.it, top.it), Dec(bot.it), + Block(*[func for i in range(j, top.inc) for func in Kernel(top.it, bot.it, i, 1)]) + ), Postamble(j) + ) + return Block(*[func for i in range(j, top.inc) for func in Kernel(top.it, bot.it, i, 1)], Dec(bot.it), Postamble(j)) + if not upper: + if j == 0: + return Block(For(None, LT(bot.it, top.it), Inc(bot.it), + Block(*[func for i in range(j, top.inc) for func in Kernel(top.it, bot.it, i, 1)]) + ), Postamble(j)) + return Block(*[func for i in range(j, top.inc) for func in Kernel(top.it, bot.it, i, 1)], Inc(bot.it), Postamble(j)) + + def Step(it, inc, down=False): + if not down: + if inc == 1: + return Inc(it) + else: + return AddSet(it, I(inc)) else: - return Block(*[func for i in range(j, top.inc) for func in Kernel(top.it, bot.it, i, 1)], Inc(bot.it)) + if inc == 1: + return Dec(it) + else: + return SubSet(it, I(inc)) - def Start(j, end): - if j == end: - return For(None, LT(bot.it, bot.end), Inc(bot.it), - Block(*[func for i in range(j+1) for func in Kernel(top.it, bot.it, i, 1)]) - ) - else: - return Block(*[func for i in range(j+1) for func in Kernel(top.it, bot.it, i, 1)], Inc(bot.it)) + # --------------------------------------------------------------- + # Main body if upper: - return For(Set(top.it, I(0)), LT(top.it, top.end), Step(top.it, top.inc), + return For(Set(top.it, Sub(top.end, I(1))), GE(top.it, I(0)), Step(top.it, top.inc, down=True), Block(*[ *[func(i) for func in Preamble for i in range(top.inc)], - Set(bot.end, Add(Paren(EvenTo(Paren(Sub(top.end, top.it)), bot.inc)), top.it)), - Set(bot.it, top.it), - *[ Start(j, top.inc-1) for j in range(top.inc) if bot.inc > 1], - For(None, LT(bot.it, bot.len), Step(bot.it, bot.inc), + Set(bot.end, Sub(Paren(EvenTo(Paren(Sub(top.it, Paren(Sub(bot.len, I(1))))), bot.inc)), Paren(Sub(bot.len, I(1))))), + For(Set(bot.it, Sub(bot.len, I(1))), GT(bot.it, bot.end), Step(bot.it, bot.inc, down=True), Block(*[func for i in range(top.inc) for func in Kernel(top.it, bot.it, i, bot.inc)]) ), - *[func(i) for func in Postamble for i in range(bot.inc)] + *[ Finish(j, upper) if bot.inc > 1 else Postamble(j) for j in range(top.inc) ], + # *[func(i) for func in Postamble for i in range(bot.inc)] ]) ) else: @@ -145,27 +155,33 @@ def TriangularLoop(top, bot, Kernel, Preamble=[], Postamble=[], upper=True): Block(*[ *[func(i) for func in Preamble for i in range(top.inc)], Set(bot.end, EvenTo(top.it, bot.inc)), - For(Set(bot.it, I(0)), LE(bot.it, bot.end), Step(bot.it, bot.inc), + For(Set(bot.it, I(0)), LT(bot.it, bot.end), Step(bot.it, bot.inc), Block(*[func for i in range(top.inc) for func in Kernel(top.it, bot.it, i, bot.inc)]) ), - *[ Finish(j) for j in range(top.inc) if bot.inc > 1], - *[func(i) for func in Postamble for i in range(bot.inc)] + *[ Finish(j) if bot.inc > 1 else Postamble(j) for j in range(top.inc) ], + # *[func(i) for func in Postamble for i in range(bot.inc)] ]) ) +def Shift(x, i, uplo): + if uplo == "upper": + return Sub(x, I(i)) + if uplo == "lower": + return Add(x, I(i)) + raise ValueError("unrecognized value") def ToKernel(name, loop): vars = VarsUsed(StmtExpr(loop.init)) | VarsUsed(StmtExpr(loop.cond)) | \ VarsUsed(StmtExpr(loop.step)) | VarsUsed(loop.body) -# def ExpandAdd(i: int, c: Emitter, inc: int): -# offset = Add(c, I(0)) -# root = Mul(Index(Index(row, I(i)), offset), Index(x, offset)) -# for n in range(1, inc): -# offset = Add(c, I(n)) -# root = Add(root, Mul(Index(Index(row, I(i)), offset), Index(x, offset))) -# return root +def ExpandAdd(row, x, i: int, c: Emitter, inc: int, uplo): + offset = Add(c, I(0)) + root = Mul(Index(Index(row, I(i)), offset), Index(x, offset)) + for n in range(1, inc): + offset = Shift(c, I(n), uplo) + root = Add(root, Mul(Index(Index(row, I(i)), offset), Index(x, offset))) + return root # ------------------------------------------------------------------------ # Blas level 2 functions @@ -181,20 +197,21 @@ def trsv(kind): ) ) - r, c, nr, nc, row, res = F.variables("r", "c", "nr", "nc", "row", "res") - flag, _len, a, m, incm, x = F.variables("flag", "len", "a", "m", "incm", "x") - incx = F.variables("incx") + r, c, nr, nc, row, res = F.variables("r", "c", "nr", "nc", "row", "res") + flag, _len, m, incm, x = F.variables("flag", "len", "m", "incm", "x") + incx = F.variables("incx") rows, cols = lambda inc_r: Iter(r, nr, _len, inc_r), lambda inc_c: Iter(c, nc, _len, inc_c) - template = lambda inc_r, inc_c: TriangularLoop(rows(inc_r), cols(inc_c), - Kernel = lambda r, c, i, inc: [AddSet(Index(Index(row, I(i)), Add(c, I(j))), Mul(Index(res, I(i)), Index(x, Add(c, I(j))))) for j in range(inc)], - Preamble = [lambda i: Set(Index(row, I(i)), Add(m, Mul(Paren(Add(r, I(i))), incm))), - lambda i: Set(Index(res, I(i)), Mul(a, Index(x, Add(r, I(i)))))], - upper = True + template = lambda inc_r, inc_c, upper: TriangularLoop(rows(inc_r), cols(inc_c), + Kernel = lambda r, c, i, inc: [AddSet(Index(res, I(i)), ExpandAdd(row, x, i, c, inc, upper))], + Preamble = [lambda i: Set(Index(row, I(i)), Add(m, Mul(Paren(Shift(r, i, upper)), incm))), + lambda i: Set(Index(res, I(i)), I(0))], + Postamble = lambda i: Set(Index(x, Shift(c, I(0), upper)), Div(Index(res, I(i)), Index(Index(row, I(i)), Shift(c, I(0), upper)))), + upper = upper == "upper" ) - loop = template(1, 1) + loop = template(1, 1, "upper") loop.emit() def syr(kind): @@ -216,16 +233,16 @@ def syr(kind): rows, cols = lambda inc_r: Iter(r, nr, _len, inc_r), lambda inc_c: Iter(c, nc, _len, inc_c) template = lambda inc_r, inc_c, upper: TriangularLoop(rows(inc_r), cols(inc_c), - Kernel = lambda r, c, i, inc: [AddSet(Index(Index(row, I(i)), Add(c, I(j))), Mul(Index(res, I(i)), Index(x, Add(c, I(j))))) for j in range(inc)], - Preamble = [lambda i: Set(Index(row, I(i)), Add(m, Mul(Paren(Add(r, I(i))), incm))), - lambda i: Set(Index(res, I(i)), Mul(a, Index(x, Add(r, I(i)))))], + Kernel = lambda r, c, i, inc: [AddSet(Index(Index(row, I(i)), Shift(c, j, upper)), Mul(Index(res, I(i)), Index(x, Shift(c, j, upper)))) for j in range(inc)], + Preamble = [lambda i: Set(Index(row, I(i)), Add(m, Mul(Paren(Shift(r, i, upper)), incm))), + lambda i: Set(Index(res, I(i)), Mul(a, Index(x, Shift(r, i, upper))))], upper = upper == "upper" ) blocks = [] for layout in ["lower", "upper"]: - floop = template(1, 1, layout) - sloop = template(1, 1, layout) + floop = template(2, 2, layout) + sloop = template(2, 2, layout) sloop.body = AsStrided(sloop.body, x, c, incx) fini = template(1, 1, layout) @@ -240,7 +257,10 @@ def syr(kind): Return(), ) ) - F.execute(If(flag, blocks[0], blocks[1])) + F.execute( + Set(nr, EvenTo(_len, ROW)), + If(flag, blocks[0], blocks[1]) + ) F.emit() def ger(kind): diff --git a/sys/libmath/rules.mk b/sys/libmath/rules.mk index 73d63e3..c82361d 100644 --- a/sys/libmath/rules.mk +++ b/sys/libmath/rules.mk @@ -1,32 +1,14 @@ -# ---- Push on stack ---- -SP := $(SP).x -DIRSTACK_$(SP) := $(d) -d := $(DIR) +include share/push.mk # Iterate through subdirectory tree # Local sources SRCS_$(d) := $(wildcard $(d)/*.c) -OBJS_$(d) := $(SRCS_$(d):.c=.o) -OBJS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(OBJS_$(d))) -DEPS_$(d) := $(OBJS_$(d):.o=.d) - -OBJS := $(OBJS) $(OBJS_$(d)) -DEPS := $(DEPS) $(DEPS_$(d)) - -# Local targets LIBS_$(d) := -LIBS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(LIBS_$(d))) -LIBS := $(LIBS) $(LIBS_$(d)) +BINS_$(d) := +TSTS_$(d) := $(d)/blas -BINS_$(d) := $(d)/blas -BINS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(BINS_$(d))) -BINS := $(BINS) $(BINS_$(d)) - -# Local rules -# $(LIBS_$(d)) = TCFLAGS := -# $(LIBS_$(d)) = TCINCS := -# $(LIBS_$(d)) = TCLIBS := +include share/paths.mk GENERATE = python $^ > $@ $(d)/blas1.c: $(d)/gen1.py @@ -42,8 +24,4 @@ $(BINS_$(d)): $(OBJS_$(d)) $(OBJ_DIR)/libn/libn.a $(LIB_DIR)/vendor/libblas.a @echo BIN $@ @$(LINK) -# ---- Pop off stack ---- --include $(DEPS_$(d)) - -d := $(DIRSTACK_$(SP)) -SP := $(basename $(SP)) +include share/pop.mk diff --git a/sys/libn/rules.mk b/sys/libn/rules.mk index 7efcae6..bd3308a 100644 --- a/sys/libn/rules.mk +++ b/sys/libn/rules.mk @@ -1,37 +1,13 @@ -# ---- Push on stack ---- -SP := $(SP).x -DIRSTACK_$(SP) := $(d) -d := $(DIR) - -# Iterate through subdirectory tree -# DIR := $(d)/bufio -# include $(DIR)/rules.mk -# ... +include share/push.mk # Local sources SRCS_$(d) := $(wildcard $(d)/*.c) ASMS_$(d) := $(wildcard $(d)/*.s) -OBJS_$(d) := $(SRCS_$(d):.c=.o) -OBJS_$(d) += $(ASMS_$(d):.s=.o) -OBJS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(OBJS_$(d))) -DEPS_$(d) := $(OBJS_$(d):.o=.d) - -OBJS := $(OBJS) $(OBJS_$(d)) -DEPS := $(DEPS) $(DEPS_$(d)) - -# Local targets LIBS_$(d) := $(d)/libn.a -LIBS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(LIBS_$(d))) -LIBS := $(LIBS) $(LIBS_$(d)) +BINS_$(d) := +TSTS_$(d) := $(d)/test -BINS_$(d) := $(d)/test -BINS_$(d) := $(patsubst $(SRC_DIR)/%, $(OBJ_DIR)/%, $(BINS_$(d))) -BINS := $(BINS) $(BINS_$(d)) - -# Local rules -# $(LIBS_$(d)) := TCFLAGS := -# $(LIBS_$(d)) := TCINCS := -# $(LIBS_$(d)) := TCLIBS := +include share/paths.mk $(LIBS_$(d)): $(OBJS_$(d)) @echo LIB $@ @@ -42,8 +18,4 @@ $(BINS_$(d)): $(OBJ_DIR)/libn/test.o $(LIBS_$(d)) @echo BIN $@ @$(LINK) -# ---- Pop off stack ---- --include $(DEPS_$(d)) - -d := $(DIRSTACK_$(SP)) -SP := $(basename $(SP)) +include share/pop.mk diff --git a/sys/rules.mk b/sys/rules.mk index aac0aaa..d7535a7 100644 --- a/sys/rules.mk +++ b/sys/rules.mk @@ -17,6 +17,9 @@ include $(DIR)/rules.mk DIR := $(d)/libbio include $(DIR)/rules.mk +DIR := $(d)/cmd +include $(DIR)/rules.mk + # ---- Pop off stack ---- d := $(DIRSTACK_$(SP)) SP := $(basename $(SP)) -- cgit v1.2.1