OpenCores
URL https://opencores.org/ocsvn/dbg_interface/dbg_interface/trunk

Subversion Repositories dbg_interface

[/] [dbg_interface/] [tags/] [rel_21/] [bench/] [verilog/] [dbg_tb.v] - Diff between revs 102 and 110

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 102 Rev 110
Line 41... Line 41...
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//
//
// CVS Revision History
// CVS Revision History
//
//
// $Log: not supported by cvs2svn $
// $Log: not supported by cvs2svn $
 
// Revision 1.27  2004/01/17 18:01:31  mohor
 
// New version.
 
//
// Revision 1.26  2004/01/17 17:01:25  mohor
// Revision 1.26  2004/01/17 17:01:25  mohor
// Almost finished.
// Almost finished.
//
//
// Revision 1.25  2004/01/16 14:51:24  mohor
// Revision 1.25  2004/01/16 14:51:24  mohor
// cpu registers added.
// cpu registers added.
Line 214... Line 217...
 
 
reg  crc_out_en;
reg  crc_out_en;
reg  crc_out_shift;
reg  crc_out_shift;
wire crc_out;
wire crc_out;
 
 
 
reg  crc_in_en;
 
wire crc_match_in;
 
 
 
 
 
 
wire tdo;
wire tdo;
 
 
assign tdo = tdo_padoe_o? tdo_pad_o : 1'hz;
assign tdo = tdo_padoe_o? tdo_pad_o : 1'hz;
Line 321... Line 327...
                   );
                   );
 
 
 
 
 
 
 
 
 
// Connecting CRC module that calculates CRC that is shifted from debug to bench
 
dbg_crc32_d1 crc32_bench_in
 
                   (
 
                    .data             (tdo),
 
                    .enable           (crc_in_en),
 
                    .shift            (1'b0),
 
                    .rst              (wb_rst_i),
 
                    .sync_rst         (update_dr_o),
 
                    .crc_out          (),
 
                    .clk              (tck_pad_i),
 
                    .crc_match        (crc_match_in)
 
                   );
 
 
 
 
 
 
 
 
wb_slave_behavioral wb_slave
wb_slave_behavioral wb_slave
                   (
                   (
                    .CLK_I            (wb_clk_i),
                    .CLK_I            (wb_clk_i),
                    .RST_I            (wb_rst_i),
                    .RST_I            (wb_rst_i),
                    .ACK_O            (wb_ack_i),
                    .ACK_O            (wb_ack_i),
Line 367... Line 389...
initial
initial
begin
begin
  test_enabled = 1'b0;
  test_enabled = 1'b0;
  crc_out_en = 1'b0;
  crc_out_en = 1'b0;
  crc_out_shift = 1'b0;
  crc_out_shift = 1'b0;
 
  crc_in_en = 1'b0;
  wb_data = 32'h01234567;
  wb_data = 32'h01234567;
  trst_pad_i = 1'b1;
  trst_pad_i = 1'b1;
  tms_pad_i = 1'hz;
  tms_pad_i = 1'hz;
  tck_pad_i = 1'hz;
  tck_pad_i = 1'hz;
  tdi_pad_i = 1'hz;
  tdi_pad_i = 1'hz;
Line 545... Line 568...
  debug_cpu(`CPU_READ8, 32'h08080808, 32'h0, 1'b0, result, "cpu_read_8"); // {command, addr, data, gen_crc_err, result, text}
  debug_cpu(`CPU_READ8, 32'h08080808, 32'h0, 1'b0, result, "cpu_read_8"); // {command, addr, data, gen_crc_err, result, text}
 
 
  #10000;
  #10000;
  debug_cpu(`CPU_GO, 32'h0, 32'hdeadbeef, 1'b0, result, "go cpu"); // {command, addr, data, gen_crc_err, result, text}
  debug_cpu(`CPU_GO, 32'h0, 32'hdeadbeef, 1'b0, result, "go cpu"); // {command, addr, data, gen_crc_err, result, text}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
/*
/*
  // Testing read and write to CPU0 registers
  // Testing read and write to CPU0 registers
  #10000;
  #10000;
  set_instruction(`CHAIN_SELECT);
  set_instruction(`CHAIN_SELECT);
  chain_select(`CPU_DEBUG_CHAIN_0, 8'h12);  // {chain, crc}
  chain_select(`CPU_DEBUG_CHAIN_0, 8'h12);  // {chain, crc}
Line 716... Line 751...
 
 
    crc_out_shift = 0;  // Disable CRC shifting
    crc_out_shift = 0;  // Disable CRC shifting
 
 
    tdi_pad_i<=#1 'hz;  // tri-state
    tdi_pad_i<=#1 'hz;  // tri-state
 
 
    gen_clk(`STATUS_LEN);   // Generating 5 clocks to read out status.
    crc_in_en = 1;      // Enable CRC calculation on incoming data
 
 
 
    gen_clk(`STATUS_LEN);   // Generating 4 clocks to read out status.
 
 
 
 
    for(i=0; i<`CRC_LEN -1; i=i+1)
    for(i=0; i<`CRC_LEN -1; i=i+1)
      gen_clk(1);
      gen_clk(1);
 
 
    tms_pad_i<=#1 1;
    tms_pad_i<=#1 1;
    gen_clk(1);         // to exit1_dr
    gen_clk(1);         // to exit1_dr
 
 
 
    crc_in_en = 0;      // Disable CRC calculation on incoming data
 
    if (~crc_match_in)
 
      begin
 
        $display("(%0t) Incoming CRC failed !!!", $time);
 
        $stop;
 
      end
 
 
    tdi_pad_i<=#1 'hz;  // tri-state
    tdi_pad_i<=#1 'hz;  // tri-state
    tms_pad_i<=#1 1;
    tms_pad_i<=#1 1;
    gen_clk(1);         // to update_dr
    gen_clk(1);         // to update_dr
    tms_pad_i<=#1 0;
    tms_pad_i<=#1 0;
    gen_clk(1);         // to run_test_idle
    gen_clk(1);         // to run_test_idle
Line 763... Line 807...
          debug_wishbone_status(command, gen_crc_err);
          debug_wishbone_status(command, gen_crc_err);
          last_wb_cmd = `WB_STATUS;  last_wb_cmd_text = "WB_STATUS";
          last_wb_cmd = `WB_STATUS;  last_wb_cmd_text = "WB_STATUS";
        end
        end
      `WB_READ8    :
      `WB_READ8    :
        begin
        begin
          $display("wb_read8 (ready=%0d, adr=0x%0x, length=0x%0x, gen_crc_err=%0d (%0s))", ready, addr, length, gen_crc_err, text);
          $display("wb_read8 (adr=0x%0x, length=0x%0x, gen_crc_err=%0d (%0s))", addr, length, gen_crc_err, text);
          debug_wishbone_set_addr(command, ready, addr, length, gen_crc_err);
          debug_wishbone_set_addr(command, addr, length, gen_crc_err);
          last_wb_cmd = `WB_READ8;  last_wb_cmd_text = "WB_READ8";
          last_wb_cmd = `WB_READ8;  last_wb_cmd_text = "WB_READ8";
        end
        end
      `WB_READ16   :
      `WB_READ16   :
        begin
        begin
          $display("wb_read16 (ready=%0d, adr=0x%0x, length=0x%0x, gen_crc_err=%0d (%0s))", ready, addr, length, gen_crc_err, text);
          $display("wb_read16 (adr=0x%0x, length=0x%0x, gen_crc_err=%0d (%0s))", addr, length, gen_crc_err, text);
          debug_wishbone_set_addr(command, ready, addr, length, gen_crc_err);
          debug_wishbone_set_addr(command, addr, length, gen_crc_err);
          last_wb_cmd = `WB_READ16;  last_wb_cmd_text = "WB_READ16";
          last_wb_cmd = `WB_READ16;  last_wb_cmd_text = "WB_READ16";
        end
        end
      `WB_READ32   :
      `WB_READ32   :
        begin
        begin
          $display("wb_read32 (ready=%0d, adr=0x%0x, length=0x%0x, gen_crc_err=%0d (%0s))", ready, addr, length, gen_crc_err, text);
          $display("wb_read32 (adr=0x%0x, length=0x%0x, gen_crc_err=%0d (%0s))", addr, length, gen_crc_err, text);
          debug_wishbone_set_addr(command, ready, addr, length, gen_crc_err);
          debug_wishbone_set_addr(command, addr, length, gen_crc_err);
          last_wb_cmd = `WB_READ32;  last_wb_cmd_text = "WB_READ32";
          last_wb_cmd = `WB_READ32;  last_wb_cmd_text = "WB_READ32";
        end
        end
      `WB_WRITE8   :
      `WB_WRITE8   :
        begin
        begin
          $display("wb_write8 (adr=0x%0x, length=0x%0x, gen_crc_err=%0d (%0s))", addr, length, gen_crc_err, text);
          $display("wb_write8 (adr=0x%0x, length=0x%0x, gen_crc_err=%0d (%0s))", addr, length, gen_crc_err, text);
          debug_wishbone_set_addr(command, ready, addr, length, gen_crc_err);
          debug_wishbone_set_addr(command, addr, length, gen_crc_err);
          last_wb_cmd = `WB_WRITE8;  last_wb_cmd_text = "WB_WRITE8";
          last_wb_cmd = `WB_WRITE8;  last_wb_cmd_text = "WB_WRITE8";
        end
        end
      `WB_WRITE16  :
      `WB_WRITE16  :
        begin
        begin
          $display("wb_write16 (adr=0x%0x, length=0x%0x, gen_crc_err=%0d (%0s))", addr, length, gen_crc_err, text);
          $display("wb_write16 (adr=0x%0x, length=0x%0x, gen_crc_err=%0d (%0s))", addr, length, gen_crc_err, text);
          debug_wishbone_set_addr(command, ready, addr, length, gen_crc_err);
          debug_wishbone_set_addr(command, addr, length, gen_crc_err);
          last_wb_cmd = `WB_WRITE16;  last_wb_cmd_text = "WB_WRITE16";
          last_wb_cmd = `WB_WRITE16;  last_wb_cmd_text = "WB_WRITE16";
        end
        end
      `WB_WRITE32  :
      `WB_WRITE32  :
        begin
        begin
          $display("wb_write32 (adr=0x%0x, length=0x%0x, gen_crc_err=%0d (%0s))", addr, length, gen_crc_err, text);
          $display("wb_write32 (adr=0x%0x, length=0x%0x, gen_crc_err=%0d (%0s))", addr, length, gen_crc_err, text);
          debug_wishbone_set_addr(command, ready, addr, length, gen_crc_err);
          debug_wishbone_set_addr(command, addr, length, gen_crc_err);
          last_wb_cmd = `WB_WRITE32;  last_wb_cmd_text = "WB_WRITE32";
          last_wb_cmd = `WB_WRITE32;  last_wb_cmd_text = "WB_WRITE32";
        end
        end
      `WB_GO       :
      `WB_GO       :
        begin
        begin
          $display("wb_go, gen_crc_err=%0d (%0s))", gen_crc_err, text);
          $display("wb_go, ready=%0d, gen_crc_err=%0d (%0s))", ready, gen_crc_err, text);
          debug_wishbone_go(command, gen_crc_err);
          debug_wishbone_go(command, ready, gen_crc_err);
//          $display("wb_go_tmp, gen_crc_err=0x%0x (%0s))", gen_crc_err, text);
//          $display("wb_go_tmp, gen_crc_err=0x%0x (%0s))", gen_crc_err, text);
//          debug_wishbone_go_tmp(command, crc);
//          debug_wishbone_go_tmp(command, crc);
          last_wb_cmd = `WB_GO;  last_wb_cmd_text = "WB_GO";
          last_wb_cmd = `WB_GO;  last_wb_cmd_text = "WB_GO";
        end
        end
    endcase
    endcase
Line 816... Line 860...
 
 
 
 
 
 
task debug_wishbone_set_addr;
task debug_wishbone_set_addr;
  input [2:0]   command;
  input [2:0]   command;
  input         wait_for_wb_ready;    // igor !!! Change this since access only occurs in the "go" stage. Add condition "fifo_empty".
 
  input [31:0]  addr;
  input [31:0]  addr;
  input [15:0]  length;
  input [15:0]  length;
  input         gen_crc_err;
  input         gen_crc_err;
  integer i;
  integer i;
 
 
Line 869... Line 912...
    end
    end
 
 
    crc_out_shift = 0;  // Disable CRC shifting
    crc_out_shift = 0;  // Disable CRC shifting
 
 
    tdi_pad_i<=#1 'hz;
    tdi_pad_i<=#1 'hz;
    if (wait_for_wb_ready)
 
      begin
 
        gen_clk(`STATUS_LEN -1);   // Generating 4 clocks to read out status. Going to pause_dr at the end
 
        tms_pad_i<=#1 1;
 
        gen_clk(1);       // to exit1_dr
 
        tms_pad_i<=#1 0;
 
        gen_clk(1);       // to pause_dr
 
 
 
        while (dbg_tb.tdo_pad_o)     // waiting for wb to send "ready" 
 
        begin
 
          gen_clk(1);       // staying in pause_dr
 
        end
 
 
 
        tms_pad_i<=#1 1;
    crc_in_en = 1;      // Enable CRC calculation on incoming data
        gen_clk(1);       // to exit2_dr
 
        tms_pad_i<=#1 0;
 
        gen_clk(1);       // to shift_dr
 
      end
 
    else
 
      gen_clk(`STATUS_LEN);   // Generating 4 clocks to read out status.
      gen_clk(`STATUS_LEN);   // Generating 4 clocks to read out status.
 
 
    for(i=0; i<`CRC_LEN -1; i=i+1)  // Getting in the CRC
    for(i=0; i<`CRC_LEN -1; i=i+1)  // Getting in the CRC
    begin
    begin
      gen_clk(1);
      gen_clk(1);
    end
    end
 
 
    tms_pad_i<=#1 1;
    tms_pad_i<=#1 1;
    gen_clk(1);         // to exit1_dr
    gen_clk(1);         // to exit1_dr
 
 
 
    crc_in_en = 0;      // Disable CRC calculation on incoming data
 
    if (~crc_match_in)
 
      begin
 
        $display("(%0t) Incoming CRC failed !!!", $time);
 
        $stop;
 
      end
 
 
    tms_pad_i<=#1 1;
    tms_pad_i<=#1 1;
    gen_clk(1);         // to update_dr
    gen_clk(1);         // to update_dr
    tms_pad_i<=#1 0;
    tms_pad_i<=#1 0;
    gen_clk(1);         // to run_test_idle
    gen_clk(1);         // to run_test_idle
  end
  end
Line 949... Line 982...
    end
    end
 
 
    crc_out_shift = 0;  // Disable CRC shifting
    crc_out_shift = 0;  // Disable CRC shifting
 
 
    tdi_pad_i<=#1 1'hz;
    tdi_pad_i<=#1 1'hz;
 
 
 
    crc_in_en = 1;      // Enable CRC calculation on incoming data
 
 
    gen_clk(`STATUS_LEN);   // Generating 4 clocks to read out status.
    gen_clk(`STATUS_LEN);   // Generating 4 clocks to read out status.
 
 
    for(i=0; i<`CRC_LEN -1; i=i+1)  // Getting in the CRC
    for(i=0; i<`CRC_LEN -1; i=i+1)  // Getting in the CRC
    begin
    begin
      gen_clk(1);
      gen_clk(1);
    end
    end
 
 
    tms_pad_i<=#1 1;
    tms_pad_i<=#1 1;
    gen_clk(1);         // to exit1_dr
    gen_clk(1);         // to exit1_dr
 
 
 
    crc_in_en = 0;      // Disable CRC calculation on incoming data
 
    if (~crc_match_in)
 
      begin
 
        $display("(%0t) Incoming CRC failed !!!", $time);
 
        $stop;
 
      end
 
 
    tms_pad_i<=#1 1;
    tms_pad_i<=#1 1;
    gen_clk(1);         // to update_dr
    gen_clk(1);         // to update_dr
    tms_pad_i<=#1 0;
    tms_pad_i<=#1 0;
    gen_clk(1);         // to run_test_idle
    gen_clk(1);         // to run_test_idle
  end
  end
Line 971... Line 1014...
 
 
 
 
 
 
task debug_wishbone_go;
task debug_wishbone_go;
  input [2:0]   command;
  input [2:0]   command;
 
  input         wait_for_wb_ready;
  input         gen_crc_err;
  input         gen_crc_err;
  integer i;
  integer i;
  reg   [4:0]   pointer;
  reg   [4:0]   pointer;
 
 
  begin
  begin
Line 1014... Line 1058...
      end
      end
 
 
    crc_out_en = 0;     // Disable CRC calculation
    crc_out_en = 0;     // Disable CRC calculation
    crc_out_shift = 1;  // Enable CRC shifting
    crc_out_shift = 1;  // Enable CRC shifting
 
 
    for(i=31; i>=0; i=i-1)
    for(i=31; i>=1; i=i-1)
    begin
    begin
      if (gen_crc_err & (i==0))  // Generate crc error at last crc bit
 
        tdi_pad_i<=#1 ~crc_out;   // error crc
 
      else
 
        tdi_pad_i<=#1 crc_out;    // ok crc
        tdi_pad_i<=#1 crc_out;    // ok crc
 
 
      gen_clk(1);
      gen_clk(1);
    end
    end
 
 
 
    if (gen_crc_err)  // Generate crc error at last crc bit
 
      tdi_pad_i<=#1 ~crc_out;   // error crc
 
    else
 
      tdi_pad_i<=#1 crc_out;    // ok crc
 
 
 
    if (wait_for_wb_ready)
 
      begin
 
        tms_pad_i<=#1 1;
 
        gen_clk(1);       // to exit1_dr. Last CRC is shifted on this clk
    crc_out_shift = 0;  // Disable CRC shifting
    crc_out_shift = 0;  // Disable CRC shifting
 
        tms_pad_i<=#1 0;
 
        gen_clk(1);       // to pause_dr
 
 
    tdi_pad_i<=#1 1'hz;
        #2;             // wait a bit for tdo to activate
 
        while (tdo)     // waiting for wb to send "ready"
 
        begin
 
          gen_clk(1);       // staying in pause_dr
 
        end
 
 
 
        tms_pad_i<=#1 1;
 
        gen_clk(1);       // to exit2_dr
 
        tms_pad_i<=#1 0;
 
        gen_clk(1);       // to shift_dr
 
      end
 
    else
 
      begin
 
        gen_clk(1);       // Last CRC is shifted on this clk
 
      end
 
 
 
 
 
    crc_out_shift = 0;  // Disable CRC shifting
 
    tdi_pad_i<=#1 1'hz;
 
    crc_in_en = 1;      // Enable CRC calculation on incoming data
 
 
    if ((last_wb_cmd == `WB_READ8) | (last_wb_cmd == `WB_READ16) | (last_wb_cmd == `WB_READ32))  // When WB_WRITEx was previously activated, data needs to be shifted.
    if ((last_wb_cmd == `WB_READ8) | (last_wb_cmd == `WB_READ16) | (last_wb_cmd == `WB_READ32))  // When WB_WRITEx was previously activated, data needs to be shifted.
      begin
      begin
        $display("\t\tGenerating %0d clocks to read %0d data bytes.", dbg_tb.i_dbg_top.i_dbg_wb.data_cnt_limit, dbg_tb.i_dbg_top.i_dbg_wb.data_cnt_limit>>3);
        $display("\t\tGenerating %0d clocks to read %0d data bytes.", dbg_tb.i_dbg_top.i_dbg_wb.data_cnt_limit, dbg_tb.i_dbg_top.i_dbg_wb.data_cnt_limit>>3);
        for (i=0; i<(dbg_tb.i_dbg_top.i_dbg_wb.data_cnt_limit); i=i+1)
        for (i=0; i<(dbg_tb.i_dbg_top.i_dbg_wb.data_cnt_limit); i=i+1)
Line 1048... Line 1116...
    end
    end
 
 
    tms_pad_i<=#1 1;
    tms_pad_i<=#1 1;
    gen_clk(1);         // to exit1_dr
    gen_clk(1);         // to exit1_dr
 
 
 
    crc_in_en = 0;      // Disable CRC calculation on incoming data
 
    if (~crc_match_in)
 
      begin
 
        $display("(%0t) Incoming CRC failed !!!", $time);
 
        $stop;
 
      end
 
 
    tms_pad_i<=#1 1;
    tms_pad_i<=#1 1;
    gen_clk(1);         // to update_dr
    gen_clk(1);         // to update_dr
    tms_pad_i<=#1 0;
    tms_pad_i<=#1 0;
    gen_clk(1);         // to run_test_idle
    gen_clk(1);         // to run_test_idle
  end
  end
Line 1179... Line 1254...
    end
    end
 
 
    crc_out_shift = 0;  // Disable CRC shifting
    crc_out_shift = 0;  // Disable CRC shifting
 
 
    tdi_pad_i<=#1 'hz;
    tdi_pad_i<=#1 'hz;
 
 
 
    crc_in_en = 1;      // Enable CRC calculation on incoming data
    gen_clk(`STATUS_LEN);   // Generating 4 clocks to read out status.
    gen_clk(`STATUS_LEN);   // Generating 4 clocks to read out status.
 
 
    for(i=0; i<`CRC_LEN -1; i=i+1)  // Getting in the CRC
    for(i=0; i<`CRC_LEN -1; i=i+1)  // Getting in the CRC
    begin
    begin
      gen_clk(1);
      gen_clk(1);
    end
    end
 
 
    tms_pad_i<=#1 1;
    tms_pad_i<=#1 1;
    gen_clk(1);         // to exit1_dr
    gen_clk(1);         // to exit1_dr
 
 
 
    crc_in_en = 0;      // Disable CRC calculation on incoming data
 
    if (~crc_match_in)
 
      begin
 
        $display("(%0t) Incoming CRC failed !!!", $time);
 
        $stop;
 
      end
 
 
    tms_pad_i<=#1 1;
    tms_pad_i<=#1 1;
    gen_clk(1);         // to update_dr
    gen_clk(1);         // to update_dr
    tms_pad_i<=#1 0;
    tms_pad_i<=#1 0;
    gen_clk(1);         // to run_test_idle
    gen_clk(1);         // to run_test_idle
  end
  end
Line 1265... Line 1349...
 
 
    crc_out_shift = 0;  // Disable CRC shifting
    crc_out_shift = 0;  // Disable CRC shifting
 
 
    tdi_pad_i<=#1 1'hz;
    tdi_pad_i<=#1 1'hz;
 
 
 
    crc_in_en = 1;      // Enable CRC calculation on incoming data
 
 
    if (last_wb_cmd == `CPU_READ32)
    if (last_wb_cmd == `CPU_READ32)
      len = 32;
      len = 32;
    else if ((last_wb_cmd == `CPU_READ8) | (last_wb_cmd == `CPU_READ_REG))
    else if ((last_wb_cmd == `CPU_READ8) | (last_wb_cmd == `CPU_READ_REG))
      len = 8;
      len = 8;
Line 1291... Line 1376...
    end
    end
 
 
    tms_pad_i<=#1 1;
    tms_pad_i<=#1 1;
    gen_clk(1);         // to exit1_dr
    gen_clk(1);         // to exit1_dr
 
 
 
    crc_in_en = 0;      // Disable CRC calculation on incoming data
 
    if (~crc_match_in)
 
      begin
 
        $display("(%0t) Incoming CRC failed !!!", $time);
 
        $stop;
 
      end
 
 
    tms_pad_i<=#1 1;
    tms_pad_i<=#1 1;
    gen_clk(1);         // to update_dr
    gen_clk(1);         // to update_dr
    tms_pad_i<=#1 0;
    tms_pad_i<=#1 0;
    gen_clk(1);         // to run_test_idle
    gen_clk(1);         // to run_test_idle
  end
  end
Line 1391... Line 1483...
    begin
    begin
      tdi_pad_i<=#1 crc[`CRC_LEN - 1 - i];
      tdi_pad_i<=#1 crc[`CRC_LEN - 1 - i];
      gen_clk(1);
      gen_clk(1);
    end
    end
 
 
    gen_clk(`STATUS_LEN);   // Generating 5 clocks to read out status.
    gen_clk(`STATUS_LEN);   // Generating 4 clocks to read out status.
 
 
 
 
    for(i=0; i<`CRC_LEN -1; i=i+1)
    for(i=0; i<`CRC_LEN -1; i=i+1)
    begin
    begin
      tdi_pad_i<=#1 1'b0;
      tdi_pad_i<=#1 1'b0;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.