New PFPU
authorlekernel <sebastien.bourdeauducq@lekernel.net>
Mon, 15 Feb 2010 20:43:14 +0000 (21:43 +0100)
committerlekernel <sebastien.bourdeauducq@lekernel.net>
Mon, 15 Feb 2010 20:43:14 +0000 (21:43 +0100)
16 files changed:
cores/pfpu/rtl/pfpu.v
cores/pfpu/rtl/pfpu_addrgen.v
cores/pfpu/rtl/pfpu_alu.v
cores/pfpu/rtl/pfpu_ctlif.v
cores/pfpu/rtl/pfpu_dma.v
cores/pfpu/rtl/pfpu_regf.v
cores/pfpu/rtl/pfpu_vect.v [deleted file]
cores/pfpu/test/complete/tb_pfpu.v
cores/pfpu/test/vpi/Makefile
cores/pfpu/test/vpi/floatconv.c
software/demo/apipe.c
software/demo/compiler.c
software/demo/eval.c
software/demo/rpipe.h
software/demo/scheduler.c
software/include/hw/pfpu.h

index 92a1555..059cc64 100644 (file)
@@ -44,6 +44,7 @@ wire [1:0] flags;
 wire [3:0] opcode;
 wire [31:0] r;
 wire r_valid;
+wire dma_en;
 wire err_collision;
 pfpu_alu alu(
        .sys_clk(sys_clk),
@@ -59,6 +60,8 @@ pfpu_alu alu(
        .r(r),                          /* < to register file */
        .r_valid(r_valid),              /* < to register file */
 
+       .dma_en(dma_en),                /* < to DMA engine and sequencer */
+
        .err_collision(err_collision)   /* < to control interface */
 );
 
@@ -72,8 +75,6 @@ wire [31:0] cr_dw;
 wire cr_w_en;
 wire [31:0] r0;
 wire [31:0] r1;
-wire dma_en;
-wire [31:0] dma_d;
 wire err_stray;
 pfpu_regf regf(
        .sys_clk(sys_clk),
@@ -95,11 +96,8 @@ pfpu_regf regf(
        .c_di(cr_dw),           /* < from control interface */
        .c_w_en(cr_w_en),       /* < from control interface */
        
-       .r0(r0),                /* < from address generator */
-       .r1(r1),                /* < from address generator */
-       
-       .dma_en(dma_en),        /* < to DMA engine and sequencer */
-       .dma_d(dma_d),          /* < to DMA engine */
+       .r0(r0),                /* < from counters */
+       .r1(r1),                /* < from counters */
 
        .err_stray(err_stray)   /* < to control interface */
 );
@@ -112,9 +110,12 @@ pfpu_dma dma(
        .sys_clk(sys_clk),
        .sys_rst(sys_rst),
 
-       .dma_en(dma_en),                /* < from register file */
-       .dma_adr(dma_adr),              /* < from address generator */
-       .dma_d(dma_d),                  /* < from register file */
+       .dma_en(dma_en),                /* < from ALU */
+       .dma_base(dma_base),            /* < from control interface */
+       .x(r0[6:0]),                    /* < from counters */
+       .y(r1[6:0]),                    /* < from counters */
+       .dma_d1(a),                     /* < from register file */
+       .dma_d2(b),                     /* < from register file */
 
        .busy(dma_busy),                /* < to sequencer */
        .ack(dma_ack),                  /* < to sequencer */
@@ -130,23 +131,20 @@ pfpu_dma dma(
 
 wire vfirst;
 wire vnext;
-wire [29:0] dma_base;
 wire [6:0] hmesh_last;
 wire [6:0] vmesh_last;
 wire vlast;
-pfpu_addrgen addrgen(
+pfpu_counters counters(
        .sys_clk(sys_clk),
        
        .first(vfirst),                 /* < from sequencer */
        .next(vnext),                   /* < from sequencer */
        
-       .dma_base(dma_base),            /* < from control interface */
        .hmesh_last(hmesh_last),        /* < from control interface */
        .vmesh_last(vmesh_last),        /* < from control interface */
        
        .r0(r0),                        /* < to register file */
        .r1(r1),                        /* < to register file */
-       .dma_adr(dma_adr),              /* < to DMA engine */
        .last(vlast)                    /* < to sequencer */
 );
 
@@ -184,13 +182,13 @@ pfpu_seq seq(
        
        .alu_rst(alu_rst),              /* < to ALU */
        
-       .dma_en(dma_en),                /* < from register file */
+       .dma_en(dma_en),                /* < from ALU */
        .dma_busy(dma_busy),            /* < from DMA engine */
        .dma_ack(dma_ack),              /* < from DMA engine */
        
-       .vfirst(vfirst),                /* < to address generator */
-       .vnext(vnext),                  /* < to address generator and control interface */
-       .vlast(vlast),                  /* < from address generator */
+       .vfirst(vfirst),                /* < to counters */
+       .vnext(vnext),                  /* < to counters and control interface */
+       .vlast(vlast),                  /* < from counters */
        
        .pcount_rst(pcount_rst),        /* < to program memory */
        .c_en(c_en),                    /* < to register file and program memory */
@@ -215,9 +213,9 @@ pfpu_ctlif #(
        .start(start),                  /* < to sequencer */
        .busy(busy),                    /* < from sequencer */
        
-       .dma_base(dma_base),            /* < to address generator */
-       .hmesh_last(hmesh_last),        /* < to address generator */
-       .vmesh_last(vmesh_last),        /* < to address generator */
+       .dma_base(dma_base),            /* < to DMA engine */
+       .hmesh_last(hmesh_last),        /* < to counters */
+       .vmesh_last(vmesh_last),        /* < to counters */
        
        .cr_addr(cr_addr),              /* < to register file */
        .cr_di(cr_dr),                  /* < from register file */
index 4c588d2..d18e415 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Milkymist VJ SoC
- * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
+ * Copyright (C) 2007, 2008, 2009, 2010 Sebastien Bourdeauducq
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-module pfpu_addrgen(
+module pfpu_counters(
        input sys_clk,
        
        input first,
        input next,
-       
-       input [29:0] dma_base, /* in 32-bit words */
+
        input [6:0] hmesh_last,
        input [6:0] vmesh_last,
        
        output [31:0] r0,
        output [31:0] r1,
-       output [31:0] dma_adr,
        output reg last
 );
 
@@ -35,8 +33,6 @@ reg [6:0] r0r;
 assign r0 = {25'd0, r0r};
 reg [6:0] r1r;
 assign r1 = {25'd0, r1r};
-reg [29:0] dma_adrr;
-assign dma_adr = {dma_adrr, 2'b00};
 
 always @(posedge sys_clk) begin
        if(first) begin
@@ -51,14 +47,12 @@ always @(posedge sys_clk) begin
        end
 end
 
-/* Having some latency in the generation of those signals
+/* Having some latency in the generation of "last"
  * is not a problem, because DMA is never immediately
  * triggered after "first" or "next" has been
  * asserted.
  */
-always @(posedge sys_clk) begin
-       dma_adrr <= dma_base + {16'd0, r1r, r0r};
+always @(posedge sys_clk)
        last <= (r0r == hmesh_last) & (r1r == vmesh_last);
-end
 
 endmodule
index 70c3d4a..ae84ad4 100644 (file)
@@ -27,6 +27,8 @@ module pfpu_alu(
        
        output [31:0] r,
        output r_valid,
+
+       output reg dma_en,
        
        output err_collision
 );
@@ -41,6 +43,14 @@ always @(posedge sys_clk) begin
                opcode_r <= opcode;
 end
 
+/* Detect VECTOUT opcodes and trigger DMA */
+always @(posedge sys_clk) begin
+       if(alu_rst)
+               dma_en <= 1'b0;
+       else
+               dma_en <= opcode == 4'h7;
+end
+
 /* Computation units */
 wire faddsub_valid;
 wire [31:0] r_faddsub;
@@ -111,20 +121,6 @@ pfpu_i2f i2f(
        .valid_o(i2f_valid)
 );
 
-wire vect_valid;
-wire [31:0] r_vect;
-pfpu_vect vect(
-       .sys_clk(sys_clk),
-       .alu_rst(alu_rst),
-       
-       .a(a),
-       .b(b),
-       .valid_i(opcode_r == 4'h7),
-       
-       .r(r_vect),
-       .valid_o(vect_valid)
-);
-
 wire sincos_valid;
 wire [31:0] r_sincos;
 pfpu_sincos sincos(
@@ -187,7 +183,6 @@ assign r =
        |({32{fdiv_valid}}      & r_fdiv)
        |({32{f2i_valid}}       & r_f2i)
        |({32{i2f_valid}}       & r_i2f)
-       |({32{vect_valid}}      & r_vect)
        |({32{sincos_valid}}    & r_sincos)
        |({32{above_valid}}     & r_above)
        |({32{equal_valid}}     & r_equal)
@@ -199,19 +194,17 @@ assign r_valid =
        |fdiv_valid
        |f2i_valid
        |i2f_valid
-       |vect_valid
        |sincos_valid
        |above_valid
        |equal_valid
        |copy_valid;
 
 assign err_collision =
-        (faddsub_valid & (fmul_valid|fdiv_valid|f2i_valid|i2f_valid|vect_valid|sincos_valid|above_valid|equal_valid|copy_valid))
-       |(fmul_valid    & (fdiv_valid|f2i_valid|i2f_valid|vect_valid|sincos_valid|above_valid|equal_valid|copy_valid))
-       |(fdiv_valid    & (f2i_valid|i2f_valid|vect_valid|sincos_valid|above_valid|equal_valid|copy_valid))
-       |(f2i_valid     & (i2f_valid|vect_valid|sincos_valid|above_valid|equal_valid|copy_valid))
-       |(i2f_valid     & (vect_valid|sincos_valid|above_valid|equal_valid|copy_valid))
-       |(vect_valid    & (sincos_valid|above_valid|equal_valid|copy_valid))
+        (faddsub_valid & (fmul_valid|fdiv_valid|f2i_valid|i2f_valid|sincos_valid|above_valid|equal_valid|copy_valid))
+       |(fmul_valid    & (fdiv_valid|f2i_valid|i2f_valid|sincos_valid|above_valid|equal_valid|copy_valid))
+       |(fdiv_valid    & (f2i_valid|i2f_valid|sincos_valid|above_valid|equal_valid|copy_valid))
+       |(f2i_valid     & (i2f_valid|sincos_valid|above_valid|equal_valid|copy_valid))
+       |(i2f_valid     & (sincos_valid|above_valid|equal_valid|copy_valid))
        |(sincos_valid  & (above_valid|equal_valid|copy_valid))
        |(above_valid   & (equal_valid|copy_valid))
        |(equal_valid   & (copy_valid));
index 8ac795a..2f20dae 100644 (file)
@@ -32,7 +32,7 @@ module pfpu_ctlif #(
        input busy,
        
        /* Address generator interface */
-       output reg [29:0] dma_base,
+       output reg [28:0] dma_base,
        output reg [6:0] hmesh_last,
        output reg [6:0] vmesh_last,
        
@@ -85,7 +85,7 @@ always @(posedge sys_clk) begin
                irq <= 1'b0;
                start <= 1'b0;
                
-               dma_base <= 30'd0;
+               dma_base <= 29'd0;
                hmesh_last <= 7'd0;
                vmesh_last <= 7'd0;
                cp_page <= 2'd0;
@@ -110,7 +110,7 @@ always @(posedge sys_clk) begin
                case(csr_a[3:0])
                        4'b0000: csr_do_r <= busy;
 
-                       4'b0001: csr_do_r <= {dma_base, 2'b00};
+                       4'b0001: csr_do_r <= {dma_base, 3'b000};
                        4'b0010: csr_do_r <= hmesh_last;
                        4'b0011: csr_do_r <= vmesh_last;
 
@@ -147,7 +147,7 @@ always @(posedge sys_clk) begin
                                                collision_counter <= 11'd0;
                                                stray_counter <= 11'd0;
                                        end
-                                       3'b001: dma_base <= csr_di[31:2];
+                                       3'b001: dma_base <= csr_di[31:3];
                                        3'b010: hmesh_last <= csr_di[6:0];
                                        3'b011: vmesh_last <= csr_di[6:0];
                                        3'b100: cp_page <= csr_di[1:0];
index cf9d86d..9b85e3b 100644 (file)
@@ -20,14 +20,17 @@ module pfpu_dma(
        input sys_rst,
 
        input dma_en,
-       input [31:0] dma_adr,
-       input [31:0] dma_d,
+       input [28:0] dma_base,
+       input [6:0] x,
+       input [6:0] y,
+       input [31:0] dma_d1,
+       input [31:0] dma_d2,
 
        output ack,
        output busy,
 
        output [31:0] wbm_dat_o,
-       output [31:0] wbm_adr_o,
+       output reg [31:0] wbm_adr_o,
        output wbm_cyc_o,
        output wbm_stb_o,
        input wbm_ack_i,
@@ -37,17 +40,19 @@ module pfpu_dma(
 
 /* FIFO logic */
 
+parameter q_width = 7+7+64;
+
 wire q_p;
 wire q_c;
-wire [63:0] q_i;
-wire [63:0] q_o;
+wire [q_width-1:0] q_i;
+wire [q_width-1:0] q_o;
 wire full;
 wire empty;
 
 reg [1:0] produce;
 reg [1:0] consume;
 reg [2:0] level;
-reg [63:0] wq[0:3];
+reg [q_width-1:0] wq[0:3];
 
 always @(posedge sys_clk) begin
        if(sys_rst) begin
@@ -85,13 +90,30 @@ end
 // synthesis translate_on
 
 /* Interface */
+reg write_y;
+
 assign q_p = dma_en;
-assign q_c = wbm_ack_i;
-assign q_i = {dma_d, dma_adr};
-assign wbm_dat_o = q_o[63:32];
-assign wbm_adr_o = q_o[31:0];
-assign wbm_cyc_o = ~empty;
-assign wbm_stb_o = ~empty;
+assign q_c = wbm_ack_i & write_y;
+assign q_i = {dma_d1, dma_d2, y, x};
+
+always @(posedge sys_clk)
+       wbm_adr_o <= {dma_base, 3'd0} + {q_o[13:0], write_y, 2'd0};
+
+always @(posedge sys_clk) begin
+       if(sys_rst)
+               write_y <= 1'b0;
+       else if(wbm_ack_i) write_y <= ~write_y;
+end
+
+assign wbm_dat_o = write_y ? q_o[45:14] : q_o[q_width-1:46];
+
+reg address_not_valid_yet;
+always @(posedge sys_clk)
+       address_not_valid_yet <= q_c;
+
+assign wbm_cyc_o = ~empty & ~address_not_valid_yet;
+assign wbm_stb_o = ~empty & ~address_not_valid_yet;
+
 assign ack = ~full;
 assign busy = ~empty;
 assign dma_pending = level;
index 9d9ee29..cf14a9d 100644 (file)
@@ -41,16 +41,12 @@ module pfpu_regf(
        /* Address Generator interface */
        input [31:0] r0,
        input [31:0] r1,
-       
-       /* DMA interface */
-       output dma_en,
-       output [31:0] dma_d,
-       
+
        output err_stray
 );
 
 /* Triple-port RAM for most of the registers.
- * R0, R1, R2 and R127 are overlaid on top of it.
+ * R0, R1 and R2 are overlaid on top of it.
  */
 wire [6:0] p1_a;
 wire [31:0] p1_d;
@@ -131,8 +127,4 @@ end
 /* Catch writes to register 0 */
 assign err_stray = p3_en & (p3_a == 7'd0);
 
-/* Catch writes to DMA Output Register (R127) */
-assign dma_en = p3_en & (p3_a == 7'd127);
-assign dma_d = p3_d;
-
 endmodule
diff --git a/cores/pfpu/rtl/pfpu_vect.v b/cores/pfpu/rtl/pfpu_vect.v
deleted file mode 100644 (file)
index 9a13f5c..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Milkymist VJ SoC
- * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, version 3 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-module pfpu_vect(
-       input sys_clk,
-       input alu_rst,
-       
-       input [31:0] a,
-       input [31:0] b,
-       input valid_i,
-       
-       output reg [31:0] r,
-       output reg valid_o
-);
-
-always @(posedge sys_clk) begin
-       if(alu_rst)
-               valid_o <= 1'b0;
-       else
-               valid_o <= valid_i;
-       r <= {a[15:0], b[15:0]};
-end
-
-endmodule
index 9eaaaec..87a69d8 100644 (file)
@@ -162,7 +162,8 @@ always begin
        csrwrite(32'h0804, 32'b0000000_0000000_0000000_0000_0000000); /* NOP */
        csrwrite(32'h0808, 32'b0000000_0000000_0000000_0000_0000000); /* NOP */
        csrwrite(32'h080C, 32'b0000000_0000000_0000000_0000_0000000); /* NOP */
-       csrwrite(32'h0810, 32'b0000000_0000000_0000000_0000_1111111); /* NOP | EXIT R127 */
+       csrwrite(32'h0810, 32'b0000000_0000000_0000000_0000_0000011); /* NOP | EXIT R3 */
+       csrwrite(32'h0814, 32'b0000000_0000011_0000100_0111_0000000); /* VECTOUT R3, R4 */
        
        /* DMA base */
        csrwrite(32'h0004, 32'h12340000);
@@ -194,7 +195,8 @@ always begin
        csrwrite(32'h0818, 32'b0000000_0000000_0000000_0000_0000000); /* NOP */
        csrwrite(32'h081C, 32'b0000000_0000000_0000000_0000_0000000); /* NOP */
        csrwrite(32'h0820, 32'b0000000_0000000_0000000_0000_0000000); /* NOP */
-       csrwrite(32'h0824, 32'b0000000_0000000_0000000_0000_1111111); /* NOP | EXIT R127 */
+       csrwrite(32'h0824, 32'b0000000_0000000_0000000_0000_0000101); /* NOP | EXIT R5 */
+       csrwrite(32'h0828, 32'b0000000_0000101_0000101_0111_0000000); /* VECTOUT R5, R5 */
        
        /* Start */
        csrwrite(32'h0000, 32'h00000001);
index 6d51834..e1ba039 100644 (file)
@@ -4,7 +4,7 @@ floatconv.so: floatconv.o
        ld -G -shared -export-dynamic -o floatconv.so floatconv.o
 
 floatconv.o: floatconv.c
-       gcc -fPIC -Wall -g -O2 -c -o floatconv.o floatconv.c
+       gcc -I/usr/include/cver -fPIC -Wall -g -O2 -c -o floatconv.o floatconv.c
 
 clean:
        rm -f floatconv.o floatconv.so
index ce78b5a..d8adefe 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Milkymist VJ SoC
- * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
+ * Copyright (C) 2007, 2008, 2009, 2010 Sebastien Bourdeauducq
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -15,6 +15,7 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <stdio.h>
 #include <vpi_user.h>
 
 /*
index bad9585..2396e85 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Milkymist VJ SoC (Software)
- * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
+ * Copyright (C) 2007, 2008, 2009, 2010 Sebastien Bourdeauducq
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -44,8 +44,8 @@ static float bass_att, mid_att, treb_att;
 static struct eval_state *eval;
 static int eval_ready;
 
-static struct rpipe_frame frame1;
-static struct rpipe_frame frame2;
+static struct rpipe_frame frame1 __attribute__((aligned(8)));
+static struct rpipe_frame frame2 __attribute__((aligned(8)));
 static int frame1_free;
 static int frame2_free;
 
index 82c9c71..db3a7ba 100644 (file)
@@ -224,20 +224,20 @@ void compiler_get_initial_regs(struct compiler_state *sc, struct compiler_initia
 void print_opcode(int opcode)
 {
        switch(opcode) {
-               case PFPU_OPCODE_NOP:   printf("NOP   "); break;
-               case PFPU_OPCODE_FADD:  printf("FADD  "); break;
-               case PFPU_OPCODE_FSUB:  printf("FSUB  "); break;
-               case PFPU_OPCODE_FMUL:  printf("FMUL  "); break;
-               case PFPU_OPCODE_FDIV:  printf("FDIV  "); break;
-               case PFPU_OPCODE_F2I:   printf("F2I   "); break;
-               case PFPU_OPCODE_I2F:   printf("I2F   "); break;
-               case PFPU_OPCODE_VECT:  printf("VECT  "); break;
-               case PFPU_OPCODE_SIN:   printf("SIN   "); break;
-               case PFPU_OPCODE_COS:   printf("COS   "); break;
-               case PFPU_OPCODE_ABOVE: printf("ABOVE "); break;
-               case PFPU_OPCODE_EQUAL: printf("EQUAL "); break;
-               case PFPU_OPCODE_COPY:  printf("COPY  "); break;
-               default:                printf("XXX   "); break;
+               case PFPU_OPCODE_NOP:     printf("NOP     "); break;
+               case PFPU_OPCODE_FADD:    printf("FADD    "); break;
+               case PFPU_OPCODE_FSUB:    printf("FSUB    "); break;
+               case PFPU_OPCODE_FMUL:    printf("FMUL    "); break;
+               case PFPU_OPCODE_FDIV:    printf("FDIV    "); break;
+               case PFPU_OPCODE_F2I:     printf("F2I     "); break;
+               case PFPU_OPCODE_I2F:     printf("I2F     "); break;
+               case PFPU_OPCODE_VECTOUT: printf("VECTOUT "); break;
+               case PFPU_OPCODE_SIN:     printf("SIN     "); break;
+               case PFPU_OPCODE_COS:     printf("COS     "); break;
+               case PFPU_OPCODE_ABOVE:   printf("ABOVE   "); break;
+               case PFPU_OPCODE_EQUAL:   printf("EQUAL   "); break;
+               case PFPU_OPCODE_COPY:    printf("COPY    "); break;
+               default:                  printf("XXX     "); break;
        }
 }
 
@@ -248,7 +248,7 @@ int get_arity(int opcode)
                case PFPU_OPCODE_FSUB:
                case PFPU_OPCODE_FMUL:
                case PFPU_OPCODE_FDIV:
-               case PFPU_OPCODE_VECT:
+               case PFPU_OPCODE_VECTOUT:
                case PFPU_OPCODE_EQUAL:
                case PFPU_OPCODE_ABOVE:
                        return 2;
index a81caea..38520c5 100644 (file)
@@ -187,10 +187,7 @@ static int generate_perframe(struct eval_state *sc, struct preset *ast)
        scheduler_dont_touch(&scheduler, compiler.terminals);
        scheduler_schedule(&scheduler, compiler.prog, compiler.prog_length);
        /* patch the program to make a dummy DMA at the end (otherwise PFPU never finishes) */
-       scheduler.prog[scheduler.last_exit].i.opcode = PFPU_OPCODE_COPY;
-       scheduler.last_exit += PFPU_LATENCY_COPY;
-       if(scheduler.last_exit >= PFPU_PROGSIZE) return 0;
-       scheduler.prog[scheduler.last_exit].i.dest = PFPU_REG_OUT;
+       scheduler.prog[scheduler.last_exit].i.opcode = PFPU_OPCODE_VECTOUT;
 
        #ifdef EVAL_DEBUG
        printf("======== Per-frame HW program ========\n");
@@ -262,10 +259,9 @@ static int generate_pervertex(struct eval_state *sc, struct preset *ast)
                sc->pervertex_regs[i] = 0.0f;
        sc->pervertex_regs[3] = 1.0f/(float)sc->hmeshlast;
        sc->pervertex_regs[4] = 1.0f/(float)sc->vmeshlast;
-       sc->pervertex_regs[5] = (float)sc->hres;
-       sc->pervertex_regs[6] = (float)sc->vres;
+       sc->pervertex_regs[5] = (float)sc->hres*(1 << TMU_FIXEDPOINT_SHIFT);
+       sc->pervertex_regs[6] = (float)sc->vres*(1 << TMU_FIXEDPOINT_SHIFT);
        sc->pervertex_regs[13] = PFPU_TRIG_CONV;
-       sc->pervertex_regs[14] = (1 << TMU_FIXEDPOINT_SHIFT);
 
        vlen = 0;
        
@@ -313,16 +309,12 @@ static int generate_pervertex(struct eval_state *sc, struct preset *ast)
        ADD_ISN(PFPU_OPCODE_FADD,       FR( 30), BR( 10), FR( 20)); /* FR20: X */
        ADD_ISN(PFPU_OPCODE_FADD,       FR( 31), BR( 11), FR( 21)); /* FR21: Y */
 
-       /* Multiply to support the TMU fixed point format */
-       ADD_ISN(PFPU_OPCODE_FMUL,       FR( 20), BR( 14), FR( 25)); /* FR25: X*FP */
-       ADD_ISN(PFPU_OPCODE_FMUL,       FR( 21), BR( 14), FR( 26)); /* FR26: Y*FP */
-
        /* Convert to screen coordinates and generate vertex */
-       ADD_ISN(PFPU_OPCODE_FMUL,       FR( 25), BR(  5), FR( 22)); /* FR22: X screen float */
-       ADD_ISN(PFPU_OPCODE_FMUL,       FR( 26), BR(  6), FR( 23)); /* FR23: Y screen float */
+       ADD_ISN(PFPU_OPCODE_FMUL,       FR( 20), BR(  5), FR( 22)); /* FR22: X screen float */
+       ADD_ISN(PFPU_OPCODE_FMUL,       FR( 21), BR(  6), FR( 23)); /* FR23: Y screen float */
        ADD_ISN(PFPU_OPCODE_F2I,        FR( 22), BR(  0), FR( 24)); /* FR26: X screen integer */
        ADD_ISN(PFPU_OPCODE_F2I,        FR( 23), BR(  0), FR( 25)); /* FR27: Y screen integer */
-       ADD_ISN(PFPU_OPCODE_VECT,       FR( 25), FR( 24), BR(127)); /* put out vector */
+       ADD_ISN(PFPU_OPCODE_VECTOUT,    FR( 25), FR( 24), BR(  0)); /* put out vector */
 
 #undef BR
 #undef FR
@@ -333,7 +325,6 @@ static int generate_pervertex(struct eval_state *sc, struct preset *ast)
        for(i=0;i<EVAL_PVV_COUNT;i++)
                scheduler.dont_touch[sc->pvv_allocation[i]] = 1;
        scheduler.dont_touch[13] = 1; /* PFPU_TRIG_CONV */
-       scheduler.dont_touch[14] = 1; /* 1 << TMU_FIXEDPOINT_SHIFT */
 
        scheduler_schedule(&scheduler, vprog, vlen);
 
index 93dde42..a09a105 100644 (file)
@@ -1,16 +1,16 @@
 /*
  * Milkymist VJ SoC (Software)
- * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
- * 
+ * Copyright (C) 2007, 2008, 2009, 2010 Sebastien Bourdeauducq
+ *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation, version 3 of the License.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
@@ -24,6 +24,7 @@ struct rpipe_frame;
 
 typedef void (*rpipe_callback)(struct rpipe_frame *frame);
 
+/* Align this structure to a 64-bit boundary so that HW is able to read vertices correctly */
 struct rpipe_frame {
        struct tmu_vertex vertices[TMU_MESH_MAXSIZE][TMU_MESH_MAXSIZE];
        unsigned int brightness;
index 75439cc..bfd5a52 100644 (file)
@@ -31,7 +31,7 @@ static int get_latency(int opcode)
                case PFPU_OPCODE_FDIV: return PFPU_LATENCY_FDIV;
                case PFPU_OPCODE_F2I: return PFPU_LATENCY_F2I;
                case PFPU_OPCODE_I2F: return PFPU_LATENCY_I2F;
-               case PFPU_OPCODE_VECT: return PFPU_LATENCY_VECT;
+               case PFPU_OPCODE_VECTOUT: return PFPU_LATENCY_VECTOUT;
                case PFPU_OPCODE_SIN: return PFPU_LATENCY_SIN;
                case PFPU_OPCODE_COS: return PFPU_LATENCY_COS;
                case PFPU_OPCODE_ABOVE: return PFPU_LATENCY_ABOVE;
index 6cbdf35..650690a 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Milkymist VJ SoC (Software)
- * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
+ * Copyright (C) 2007, 2008, 2009, 2010 Sebastien Bourdeauducq
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -46,7 +46,7 @@
 #define PFPU_OPCODE_FDIV       (0x4)
 #define PFPU_OPCODE_F2I                (0x5)
 #define PFPU_OPCODE_I2F                (0x6)
-#define PFPU_OPCODE_VECT       (0x7)
+#define PFPU_OPCODE_VECTOUT    (0x7)
 #define PFPU_OPCODE_SIN                (0x8)
 #define PFPU_OPCODE_COS                (0x9)
 #define PFPU_OPCODE_ABOVE      (0xa)
@@ -59,7 +59,7 @@
 #define PFPU_LATENCY_FDIV      (0) /* TODO */
 #define PFPU_LATENCY_F2I       (2)
 #define PFPU_LATENCY_I2F       (3)
-#define PFPU_LATENCY_VECT      (2)
+#define PFPU_LATENCY_VECTOUT   (0)
 #define PFPU_LATENCY_SIN       (4)
 #define PFPU_LATENCY_COS       (4)
 #define PFPU_LATENCY_ABOVE     (2)
 #define PFPU_REG_X             (0)
 #define PFPU_REG_Y             (1)
 #define PFPU_REG_FLAGS         (2)
-#define PFPU_REG_OUT           (127)
 
 #define PFPU_TRIG_CONV         (8192.0/(2.0*3.14159265358))
 
 static inline int pfpu_is_reserved(int reg)
 {
-       return (reg == PFPU_REG_X)||(reg == PFPU_REG_Y)||(reg == PFPU_REG_FLAGS)||(reg == PFPU_REG_OUT);
+       return (reg == PFPU_REG_X)||(reg == PFPU_REG_Y)||(reg == PFPU_REG_FLAGS);
 }
 
 typedef union {