Best Python code snippet using autotest_python
regs_gen.py
Source:regs_gen.py  
1#! /usr/bin/env python2# Copyright (c) 2015 Noa Zilberman3# All rights reserved.4#5# This software was developed by Stanford University and the University of Cambridge Computer Laboratory6# under National Science Foundation under Grant No. CNS-0855268,7# the University of Cambridge Computer Laboratory under EPSRC INTERNET Project EP/H040536/1 and8# by the University of Cambridge Computer Laboratory under DARPA/AFRL contract FA8750-11-C-0249 (),9# as part of the DARPA MRC research programme.10#11# @NETFPGA_LICENSE_HEADER_START@12#13# Licensed to NetFPGA C.I.C. (NetFPGA) under one or more contributor14# license agreements.  See the NOTICE file distributed with this work for15# additional information regarding copyright ownership.  NetFPGA licenses this16# file to you under the NetFPGA Hardware-Software License, Version 1.0 (the17# ); you may not use this file except in compliance with the18# License.  You may obtain a copy of the License at:19#20#   http://www.netfpga-cic.org21#22# Unless required by applicable law or agreed to in writing, Work distributed23# under the License is distributed on an ``AS IS'' BASIS, WITHOUT WARRANTIES OR24# CONDITIONS OF ANY KIND, either express or implied.  See the License for the25# specific language governing permissions and limitations under the License.26#27# @NETFPGA_LICENSE_HEADER_END@28#29##################################################################30#Define the list of registers (busses) and their characteristics31##################################################################32 33module_name='crypto'34block_name=module_name.upper()35 36def create_regs_list():37  regsDict=[38{'reg':"ID",'type':"RO",'endian':"little", 'name':"id",'bits':"31:0",'width':"32",'addr':"32'h0",'default':"32'h0000DA01"},39{'reg':"Version",'type':"RO",'endian':"little", 'name':"version",'bits':"31:0",'width':"32",'addr':"32'h4",'default':"32'h1"},40{'reg':"Reset",'type':"WOE",'endian':"little", 'name':"reset",'bits':"15:0",'width':"16",'addr':"32'h8",'default':"16'h0"},41{'reg':"Flip",'type':"RWA",'endian':"little", 'name':"flip",'bits':"31:0",'width':"32",'addr':"32'hC",'default':"32'h0"},42{'reg':"Debug",'type':"RWA",'endian':"little", 'name':"debug",'bits':"31:0",'width':"32",'addr':"32'h10",'default':"32'h0"},43{'reg':"PktIn",'type':"ROC",'endian':"little", 'name':"pktin",'bits':"31:0",'width':"32",'addr':"32'h14",'default':"32'h0"},44{'reg':"PktOut",'type':"ROC",'endian':"little", 'name':"pktout",'bits':"31:0",'width':"32",'addr':"32'h18",'default':"32'h0"},45{'reg':"key",'type':"RWS",'endian':"big", 'name':"key",'bits':"31:0",'width':"32",'addr':"32'h1C",'default':"32'hF"},46]47  return(regsDict)48 49def create_mems_list():50  memsDict=[ 51]52  return(memsDict)53#54# Copyright (c) 2015 Noa Zilberman, Jingyun Zhang, Salvator Galea55# All rights reserved.56#57# This software was developed by Stanford University and the University of Cambridge Computer Laboratory 58# under National Science Foundation under Grant No. CNS-0855268,59# the University of Cambridge Computer Laboratory under EPSRC INTERNET Project EP/H040536/1 and60# by the University of Cambridge Computer Laboratory under DARPA/AFRL contract FA8750-11-C-0249 ("MRC2"), 61# as part of the DARPA MRC research programme.62#63# @NETFPGA_LICENSE_HEADER_START@64#65# Licensed to NetFPGA C.I.C. (NetFPGA) under one or more contributor66# license agreements.  See the NOTICE file distributed with this work for67# additional information regarding copyright ownership.  NetFPGA licenses this68# file to you under the NetFPGA Hardware-Software License, Version 1.0 (the69# "License"); you may not use this file except in compliance with the70# License.  You may obtain a copy of the License at:71#72#   http://www.netfpga-cic.org73#74# Unless required by applicable law or agreed to in writing, Work distributed75# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR76# CONDITIONS OF ANY KIND, either express or implied.  See the License for the77# specific language governing permissions and limitations under the License.78#79# @NETFPGA_LICENSE_HEADER_END@80#81##################################################################82# a function that writes the header of regs file83##################################################################84def write_regs_header(regsFile):85      regsFile.write('\86//\n\87// Copyright (c) 2015 University of Cambridge\n\88// All rights reserved.\n\89//\n\90//\n\91//  File:\n\92//        '+module_name+'_cpu_regs.v\n\93//\n\94//  Module:\n\95//        '+module_name+'_cpu_regs\n\96//\n\97//  Description:\n\98//        This file is automatically generated with the registers towards the CPU/Software\n\99//\n\100// This software was developed by Stanford University and the University of Cambridge Computer Laboratory\n\101// under National Science Foundation under Grant No. CNS-0855268,\n\102// the University of Cambridge Computer Laboratory under EPSRC INTERNET Project EP/H040536/1 and\n\103// by the University of Cambridge Computer Laboratory under DARPA/AFRL contract FA8750-11-C-0249 ("MRC2"),\n\104// as part of the DARPA MRC research programme.\n\105//\n\106// @NETFPGA_LICENSE_HEADER_START@\n\107//\n\108// Licensed to NetFPGA C.I.C. (NetFPGA) under one or more contributor\n\109// license agreements.  See the NOTICE file distributed with this work for\n\110// additional information regarding copyright ownership.  NetFPGA licenses this\n\111// file to you under the NetFPGA Hardware-Software License, Version 1.0 (the\n\112// "License"); you may not use this file except in compliance with the\n\113// License.  You may obtain a copy of the License at:\n\114//\n\115//   http://www.netfpga-cic.org\n\116//\n\117// Unless required by applicable law or agreed to in writing, Work distributed\n\118// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR\n\119// CONDITIONS OF ANY KIND, either express or implied.  See the License for the\n\120// specific language governing permissions and limitations under the License.\n\121//\n\122// @NETFPGA_LICENSE_HEADER_END@\n\123//\n\124\n')125#end of write_regs_headerdefault126##################################################################127# a function that writes the header of regs defines file128##################################################################129def write_defs_header(defsFile):130      defsFile.write('\131//\n\132// Copyright (c) 2015 University of Cambridge\n\133// All rights reserved.\n\134//\n\135//\n\136//  File:\n\137//        '+module_name+'_cpu_regs_defines.v\n\138//\n\139//  Module:\n\140//        '+module_name+'_cpu_regs_defines\n\141//\n\142//  Description:\n\143//        This file is automatically generated with the registers defintions towards the CPU/Software\n\144//\n\145// This software was developed by Stanford University and the University of Cambridge Computer Laboratory\n\146// under National Science Foundation under Grant No. CNS-0855268,\n\147// the University of Cambridge Computer Laboratory under EPSRC INTERNET Project EP/H040536/1 and\n\148// by the University of Cambridge Computer Laboratory under DARPA/AFRL contract FA8750-11-C-0249 ("MRC2"),\n\149// as part of the DARPA MRC research programme.\n\150//\n\151// @NETFPGA_LICENSE_HEADER_START@\n\152//\n\153// Licensed to NetFPGA C.I.C. (NetFPGA) under one or more contributor\n\154// license agreements.  See the NOTICE file distributed with this work for\n\155// additional information regarding copyright ownership.  NetFPGA licenses this\n\156// file to you under the NetFPGA Hardware-Software License, Version 1.0 (the\n\157// "License"); you may not use this file except in compliance with the\n\158// License.  You may obtain a copy of the License at:\n\159//\n\160//   http://www.netfpga-cic.org\n\161//\n\162// Unless required by applicable law or agreed to in writing, Work distributed\n\163// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR\n\164// CONDITIONS OF ANY KIND, either express or implied.  See the License for the\n\165// specific language governing permissions and limitations under the License.\n\166//\n\167// @NETFPGA_LICENSE_HEADER_END@\n\168//\n\169\n')170#end of write_defs_header171##################################################################172# a function that writes the header of regs tcl file173##################################################################174def write_tcl_header(tclFile):175      tclFile.write('\176#\n\177# Copyright (c) 2015 University of Cambridge\n\178# All rights reserved.\n\179#\n\180#\n\181#  File:\n\182#        '+module_name+'_regs_defines.tcl\n\183#\n\184#  Description:\n\185#        This file is automatically generated with tcl defines for the software\n\186#\n\187# This software was developed by Stanford University and the University of Cambridge Computer Laboratory\n\188# under National Science Foundation under Grant No. CNS-0855268,\n\189# the University of Cambridge Computer Laboratory under EPSRC INTERNET Project EP/H040536/1 and\n\190# by the University of Cambridge Computer Laboratory under DARPA/AFRL contract FA8750-11-C-0249 ("MRC2"),\n\191# as part of the DARPA MRC research programme.\n\192#\n\193# @NETFPGA_LICENSE_HEADER_START@\n\194#\n\195# Licensed to NetFPGA C.I.C. (NetFPGA) under one or more contributor\n\196# license agreements.  See the NOTICE file distributed with this work for\n\197# additional information regarding copyright ownership.  NetFPGA licenses this\n\198# file to you under the NetFPGA Hardware-Software License, Version 1.0 (the\n\199# "License"); you may not use this file except in compliance with the\n\200# License.  You may obtain a copy of the License at:\n\201#\n\202#   http://www.netfpga-cic.org\n\203#\n\204# Unless required by applicable law or agreed to in writing, Work distributed\n\205# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR\n\206# CONDITIONS OF ANY KIND, either express or implied.  See the License for the\n\207# specific language governing permissions and limitations under the License.\n\208#\n\209# @NETFPGA_LICENSE_HEADER_END@\n\210#\n\211\n')212#end of write_tcl_header213##################################################################214# a function that writes the header of regs tcl file215##################################################################216def write_hFile_header(hFile):217      hFile.write('\218//\n\219// Copyright (c) 2015 University of Cambridge\n\220// All rights reserved.\n\221//\n\222//\n\223//  File:\n\224//        '+module_name+'_regs_defines.h\n\225//\n\226//  Description:\n\227//        This file is automatically generated with header defines for the software\n\228//\n\229// This software was developed by Stanford University and the University of Cambridge Computer Laboratory\n\230// under National Science Foundation under Grant No. CNS-0855268,\n\231// the University of Cambridge Computer Laboratory under EPSRC INTERNET Project EP/H040536/1 and\n\232// by the University of Cambridge Computer Laboratory under DARPA/AFRL contract FA8750-11-C-0249 ("MRC2"),\n\233// as part of the DARPA MRC research programme.\n\234//\n\235// @NETFPGA_LICENSE_HEADER_START@\n\236//\n\237// Licensed to NetFPGA C.I.C. (NetFPGA) under one or more contributor\n\238// license agreements.  See the NOTICE file distributed with this work for\n\239// additional information regarding copyright ownership.  NetFPGA licenses this\n\240// file to you under the NetFPGA Hardware-Software License, Version 1.0 (the\n\241// "License"); you may not use this file except in compliance with the\n\242// License.  You may obtain a copy of the License at:\n\243//\n\244//   http://www.netfpga-cic.org\n\245//\n\246// Unless required by applicable law or agreed to in writing, Work distributed\n\247// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR\n\248// CONDITIONS OF ANY KIND, either express or implied.  See the License for the\n\249// specific language governing permissions and limitations under the License.\n\250//\n\251// @NETFPGA_LICENSE_HEADER_END@\n\252//\n\253\n')254#end of write_h_header255##################################################################256# a function that writes the header of regs table file257##################################################################258def write_tbFile_header(tbFile):259      tbFile.write('\260//\n\261// Copyright (c) 2015 University of Cambridge\n\262// All rights reserved.\n\263//\n\264//\n\265//  File:\n\266//        '+module_name+'_regs_defines.txt\n\267//\n\268//  Description:\n\269//        This file is automatically generated with header defines for the software\n\270//\n\271// This software was developed by Stanford University and the University of Cambridge Computer Laboratory\n\272// under National Science Foundation under Grant No. CNS-0855268,\n\273// the University of Cambridge Computer Laboratory under EPSRC INTERNET Project EP/H040536/1 and\n\274// by the University of Cambridge Computer Laboratory under DARPA/AFRL contract FA8750-11-C-0249 ("MRC2"),\n\275// as part of the DARPA MRC research programme.\n\276//\n\277// @NETFPGA_LICENSE_HEADER_START@\n\278//\n\279// Licensed to NetFPGA C.I.C. (NetFPGA) under one or more contributor\n\280// license agreements.  See the NOTICE file distributed with this work for\n\281// additional information regarding copyright ownership.  NetFPGA licenses this\n\282// file to you under the NetFPGA Hardware-Software License, Version 1.0 (the\n\283// "License"); you may not use this file except in compliance with the\n\284// License.  You may obtain a copy of the License at:\n\285//\n\286//   http://www.netfpga-cic.org\n\287//\n\288// Unless required by applicable law or agreed to in writing, Work distributed\n\289// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR\n\290// CONDITIONS OF ANY KIND, either express or implied.  See the License for the\n\291// specific language governing permissions and limitations under the License.\n\292//\n\293// @NETFPGA_LICENSE_HEADER_END@\n\294//\n\295\n')296##################################################################297#A funtion that writes the ports of the regs moduledefault298##################################################################299def write_regs_ports(regsFile,regsDict, memsDict):300   regsFile.write('`include "'+module_name+'_cpu_regs_defines.v"\n\301\302module '+module_name+'_cpu_regs #\n\303(\n\304parameter C_BASE_ADDRESS        = 32\'h00000000,\n\305parameter C_S_AXI_DATA_WIDTH    = 32,\n\306parameter C_S_AXI_ADDR_WIDTH    = 32\n\307)\n\308(\n\309    // General ports\n\310    input       clk,\n\311    input       resetn,\n\312    // Global Registers\n\313    input       cpu_resetn_soft,\n\314    output reg  resetn_soft,\n\315    output reg  resetn_sync,\n\316\n\317   // Register ports\n')318   for entry in regsDict:319     if entry['type']=="RO" :320       regsFile.write('    input      [`REG_'+(entry['name']).upper()+'_BITS]    '+entry['name']+'_reg,\n')321     if entry['type']=="ROC" :322       regsFile.write('    input      [`REG_'+(entry['name']).upper()+'_BITS]    '+entry['name']+'_reg,\n')323       regsFile.write('    output reg                          '+entry['name']+'_reg_clear,\n')324     if entry['type']=="RWS" :325       regsFile.write('    output reg [`REG_'+(entry['name']).upper()+'_BITS]    '+entry['name']+'_reg,\n')326     if entry['type']=="WO" :327       regsFile.write('    output reg [`REG_'+(entry['name']).upper()+'_BITS]    '+entry['name']+'_reg,\n')328     if entry['type']=="WOE" :329       regsFile.write('    output reg [`REG_'+(entry['name']).upper()+'_BITS]    '+entry['name']+'_reg,\n')330     if entry['type']=="RWA" :331       regsFile.write('    input      [`REG_'+(entry['name']).upper()+'_BITS]    ip2cpu_'+entry['name']+'_reg,\n')332       regsFile.write('    output reg [`REG_'+(entry['name']).upper()+'_BITS]    cpu2ip_'+entry['name']+'_reg,\n')333     if entry['type']=="RWCR" :334       regsFile.write('    input      [`REG_'+(entry['name']).upper()+'_BITS]    ip2cpu_'+entry['name']+'_reg,\n')335       regsFile.write('    output reg [`REG_'+(entry['name']).upper()+'_BITS]    cpu2ip_'+entry['name']+'_reg,\n')336       regsFile.write('    output reg                          cpu2ip_'+entry['name']+'_reg_clear,\n')337     if entry['type']=="RWCW" :338       regsFile.write('    input      [`REG_'+(entry['name']).upper()+'_BITS]    ip2cpu_'+entry['name']+'_reg,\n')339       regsFile.write('    output reg [`REG_'+(entry['name']).upper()+'_BITS]    cpu2ip_'+entry['name']+'_reg,\n')340       regsFile.write('    output reg                          cpu2ip_'+entry['name']+'_reg_clear,\n')341   for entry in memsDict:342       regsFile.write('    output  reg [`MEM_'+(entry['name']).upper()+'_ADDR_BITS]    '+entry['name']+'_addr,\n')343       regsFile.write('    output  reg [`MEM_'+(entry['name']).upper()+'_DATA_BITS]    '+entry['name']+'_data,\n')344       regsFile.write('    output  reg                         '+entry['name']+'_rd_wrn,\n')345       regsFile.write('    output  reg                         '+entry['name']+'_cmd_valid,\n')346       regsFile.write('    input       [`MEM_'+(entry['name']).upper()+'_DATA_BITS]    '+entry['name']+'_reply,\n')347       regsFile.write('    input                               '+entry['name']+'_reply_valid,\n')       348  349   regsFile.write('\n\350    // AXI Lite ports\n\351    input                                     S_AXI_ACLK,\n\352    input                                     S_AXI_ARESETN,\n\353    input      [C_S_AXI_ADDR_WIDTH-1 : 0]     S_AXI_AWADDR,\n\354    input                                     S_AXI_AWVALID,\n\355    input      [C_S_AXI_DATA_WIDTH-1 : 0]     S_AXI_WDATA,\n\356    input      [C_S_AXI_DATA_WIDTH/8-1 : 0]   S_AXI_WSTRB,\n\357    input                                     S_AXI_WVALID,\n\358    input                                     S_AXI_BREADY,\n\359    input      [C_S_AXI_ADDR_WIDTH-1 : 0]     S_AXI_ARADDR,\n\360    input                                     S_AXI_ARVALID,\n\361    input                                     S_AXI_RREADY,\n\362    output                                    S_AXI_ARREADY,\n\363    output     [C_S_AXI_DATA_WIDTH-1 : 0]     S_AXI_RDATA,\n\364    output     [1 : 0]                        S_AXI_RRESP,\n\365    output                                    S_AXI_RVALID,\n\366    output                                    S_AXI_WREADY,\n\367    output     [1 :0]                         S_AXI_BRESP,\n\368    output                                    S_AXI_BVALID,\n\369    output                                    S_AXI_AWREADY\n\370\n\371);\n');372#end of write_regs_ports373##################################################################374#A funtion that writes the wires and regs of the registers module375##################################################################376def write_regs_wires(regsFile,regsDict,memsDict):377    regsFile.write('\n\378    // AXI4LITE signals\n\379    reg [C_S_AXI_ADDR_WIDTH-1 : 0]      axi_awaddr;\n\380    reg                                 axi_awready;\n\381    reg                                 axi_wready;\n\382    reg [1 : 0]                         axi_bresp;\n\383    reg                                 axi_bvalid;\n\384    reg [C_S_AXI_ADDR_WIDTH-1 : 0]      axi_araddr;\n\385    reg                                 axi_arready;\n\386    reg [C_S_AXI_DATA_WIDTH-1 : 0]      axi_rdata;\n\387    reg [1 : 0]                         axi_rresp;\n\388    reg                                 axi_rvalid;\n\389\n\390    reg                                 resetn_sync_d;\n\391    wire                                reg_rden;\n\392    wire                                reg_wren;\n\393    reg [C_S_AXI_DATA_WIDTH-1:0]        reg_data_out;\n\394    integer                             byte_index;\n');395    for entry in regsDict:396        if entry['type']=="RWCW" :397            regsFile.write('\398    reg                                 cpu2ip_'+entry['name']+'_reg_clear_d;\n')399    for entry in regsDict:400        if entry['type']=="ROC" :401            regsFile.write('\402    reg                                 '+entry['name']+'_reg_clear_d;\n')403    for entry in regsDict:404            if entry['type']=="RWSI" or entry['type']=="ROI" :405                regsFile.write('\406    reg      [`REG_'+(entry['name']).upper()+'_BITS] '+entry['name']+'_reg;\n')407    for entry in regsDict:408            if entry['type']=="RWI" :409                regsFile.write('\410    reg      [`REG_'+(entry['name']).upper()+'_BITS] '+entry['name']+'_reg;\n\411    reg      [`REG_'+(entry['name']).upper()+'_BITS] '+entry['name']+'_reg_internal;\n\412    reg      '+entry['name']+'_reg_update;\n') 413    414    for entry in regsDict:415        if entry['endian']=="big" :416            regsFile.write('\n\417    // assign default little endian\n');418            regsFile.write('\419    wire [C_S_AXI_DATA_WIDTH-1 : 0]     reg_'+entry['name']+'_default_little;\n');420    for entry in regsDict:421        if entry['endian']=="big" :422            regsFile.write('\423    assign  reg_'+entry['name']+'_default_little = `REG_'+entry['name'].upper()+'_DEFAULT;\n');424    regsFile.write('\n\425    // I/O Connections assignments\n\426    assign S_AXI_AWREADY    = axi_awready;\n\427    assign S_AXI_WREADY     = axi_wready;\n\428    assign S_AXI_BRESP      = axi_bresp;\n\429    assign S_AXI_BVALID     = axi_bvalid;\n\430    assign S_AXI_ARREADY    = axi_arready;\n\431    assign S_AXI_RDATA      = axi_rdata;\n\432    assign S_AXI_RRESP      = axi_rresp;\n\433    assign S_AXI_RVALID     = axi_rvalid;\n\434\n');435#end of write_regs_wires436##################################################################437#sync reset signal for better timing438##################################################################439def sync_reset(regsFile):440    regsFile.write('\n\441    //Sample reset (not mandatory, but good practice)\n\442    always @ (posedge clk) begin\n\443        if (~resetn) begin\n\444            resetn_sync_d  <=  1\'b0;\n\445            resetn_sync    <=  1\'b0;\n\446        end\n\447        else begin\n\448            resetn_sync_d  <=  resetn;\n\449            resetn_sync    <=  resetn_sync_d;\n\450        end\n\451    end\n\452\n');453# for now, only global reset is supported, to demonstrate usage454    regsFile.write('\n\455    //global registers, sampling\n\456    always @(posedge clk) resetn_soft <= #1 cpu_resetn_soft;\n');457#end of sync_reset458##################################################################459# a function that writes the logic behind the registers access460##################################################################461def write_logic(regsFile,regsDict):462# boolean first_item;463# axi protocol generation464    regsFile.write('\n\465    // Implement axi_awready generation\n\466\n\467    always @( posedge S_AXI_ACLK )\n\468    begin\n\469      if ( S_AXI_ARESETN == 1\'b0 )\n\470        begin\n\471          axi_awready <= 1\'b0;\n\472        end\n\473      else\n\474        begin\n\475          if (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID)\n\476            begin\n\477              // slave is ready to accept write address when\n\478              // there is a valid write address and write data\n\479              // on the write address and data bus. This design\n\480              // expects no outstanding transactions.\n\481              axi_awready <= 1\'b1;\n\482            end\n\483          else\n\484            begin\n\485              axi_awready <= 1\'b0;\n\486            end\n\487        end\n\488    end\n\489\n\490    // Implement axi_awaddr latching\n\491\n\492    always @( posedge S_AXI_ACLK )\n\493    begin\n\494      if ( S_AXI_ARESETN == 1\'b0 )\n\495        begin\n\496          axi_awaddr <= 0;\n\497        end\n\498      else\n\499        begin\n\500          if (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID)\n\501            begin\n\502              // Write Address latching\n\503              axi_awaddr <= S_AXI_AWADDR ^ C_BASE_ADDRESS;\n\504            end\n\505        end\n\506    end\n\507\n\508    // Implement axi_wready generation\n\509\n\510    always @( posedge S_AXI_ACLK )\n\511    begin\n\512      if ( S_AXI_ARESETN == 1\'b0 )\n\513        begin\n\514          axi_wready <= 1\'b0;\n\515        end\n\516      else\n\517        begin\n\518          if (~axi_wready && S_AXI_WVALID && S_AXI_AWVALID)\n\519            begin\n\520              // slave is ready to accept write data when\n\521              // there is a valid write address and write data\n\522              // on the write address and data bus. This design\n\523              // expects no outstanding transactions.\n\524              axi_wready <= 1\'b1;\n\525            end\n\526          else\n\527            begin\n\528              axi_wready <= 1\'b0;\n\529            end\n\530        end\n\531    end\n\532\n\533    // Implement write response logic generation\n\534\n\535    always @( posedge S_AXI_ACLK )\n\536    begin\n\537      if ( S_AXI_ARESETN == 1\'b0 )\n\538        begin\n\539          axi_bvalid  <= 0;\n\540          axi_bresp   <= 2\'b0;\n\541        end\n\542      else\n\543        begin\n\544          if (axi_awready && S_AXI_AWVALID && ~axi_bvalid && axi_wready && S_AXI_WVALID)\n\545            begin\n\546              // indicates a valid write response is available\n\547              axi_bvalid <= 1\'b1;\n\548              axi_bresp  <= 2\'b0; // OKAY response\n\549            end                   // work error responses in future\n\550          else\n\551            begin\n\552              if (S_AXI_BREADY && axi_bvalid)\n\553                //check if bready is asserted while bvalid is high)\n\554                //(there is a possibility that bready is always asserted high)\n\555                begin\n\556                  axi_bvalid <= 1\'b0;\n\557                end\n\558            end\n\559        end\n\560    end\n\561\n\562    // Implement axi_arready generation\n\563\n\564    always @( posedge S_AXI_ACLK )\n\565    begin\n\566      if ( S_AXI_ARESETN == 1\'b0 )\n\567        begin\n\568          axi_arready <= 1\'b0;\n\569          axi_araddr  <= 32\'b0;\n\570        end\n\571      else\n\572        begin\n\573          if (~axi_arready && S_AXI_ARVALID)\n\574            begin\n\575              // indicates that the slave has acceped the valid read address\n\576              // Read address latching\n\577              axi_arready <= 1\'b1;\n\578              axi_araddr  <= S_AXI_ARADDR ^ C_BASE_ADDRESS;\n\579            end\n\580          else\n\581            begin\n\582              axi_arready <= 1\'b0;\n\583            end\n\584        end\n\585    end\n\586\n\587\n\588    // Implement axi_rvalid generation\n\589\n\590    always @( posedge S_AXI_ACLK )\n\591    begin\n\592      if ( S_AXI_ARESETN == 1\'b0 )\n\593        begin\n\594          axi_rvalid <= 0;\n\595          axi_rresp  <= 0;\n\596        end\n\597      else\n\598        begin\n\599          if (axi_arready && S_AXI_ARVALID && ~axi_rvalid)\n\600            begin\n\601              // Valid read data is available at the read data bus\n\602              axi_rvalid <= 1\'b1;\n\603              axi_rresp  <= 2\'b0; // OKAY response\n\604            end\n\605          else if (axi_rvalid && S_AXI_RREADY)\n\606            begin\n\607              // Read data is accepted by the master\n\608              axi_rvalid <= 1\'b0;\n\609            end\n\610        end\n\611    end\n\612\n\613\n');614    regsFile.write('\615    // Implement memory mapped register select and write logic generation\n\616\n\617    assign reg_wren = axi_wready && S_AXI_WVALID && axi_awready && S_AXI_AWVALID;\n\618\n\619//////////////////////////////////////////////////////////////\n\620// write registers\n\621//////////////////////////////////////////////////////////////\n\622\n');623#Handle write only registers624    first_item=True; 625    for entry in regsDict:626        if entry['type']=="WO" :627            if first_item:628                regsFile.write('\n\629//Write only register, not cleared\n\630    //static\n\631    always @(posedge clk)\n\632        if (!resetn_sync) begin\n');633                first_item=False;634                if entry['endian']=="little" :635                    regsFile.write('\636            '+entry['name']+'_reg <= #1 `REG_'+entry['name'].upper()+'_DEFAULT;\n');637                if entry['endian']=="big" :638                    regsFile.write('\639            for (byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\640                '+entry['name']+'_reg[byte_index*8 +: 8] <= reg_'+entry['name']+'_default_little[(C_S_AXI_DATA_WIDTH/8-byte_index-1)*8 +: 8];\n');641    if not(first_item):642        regsFile.write('        end\n\643        else begin\n\644            if (reg_wren) begin //write event\n\645                case (axi_awaddr)\n');646    for entry in regsDict:647        if entry['type']=="WO" :648            if entry['endian']=="little" :649                regsFile.write('                //'+entry['name'].capitalize()+' Register\n\650                    `REG_'+entry['name'].upper()+'_ADDR : begin\n\651                        for ( byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\652                            if (S_AXI_WSTRB[byte_index] == 1) begin\n\653                                '+entry['name']+'_reg[byte_index*8 +: 8] <=  S_AXI_WDATA[byte_index*8 +: 8];\n\654                            end\n\655                    end\n');656            if entry['endian']=="big" :657                regsFile.write('                //'+entry['name'].capitalize()+' Register\n\658                    `REG_'+entry['name'].upper()+'_ADDR : begin\n\659                        for (byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\660                            if (S_AXI_WSTRB[byte_index] == 1) begin\n\661                                '+entry['name']+'_reg[byte_index*8 +: 8] <= S_AXI_WDATA[(C_S_AXI_DATA_WIDTH/8-byte_index-1)*8 +: 8]; //dynamic register;\n\662                            end\n\663                    end\n');664    if not(first_item):665        regsFile.write('\666                endcase\n\667            end\n\668        end\n');669#Handle write only event registers670    first_item=True; 671    for entry in regsDict:672        if entry['type']=="WOE" :673            if first_item:674                first_item= False;675                regsFile.write('\n\676//Write only register, clear on write (i.e. event)\n\677    always @(posedge clk) begin\n\678        if (!resetn_sync) begin\n');679                if entry['endian']=="little" :680                    regsFile.write('\681            '+entry['name']+'_reg <= #1 `REG_'+entry['name'].upper()+'_DEFAULT;\n');682                if entry['endian']=="big" :683                    regsFile.write('\684            for (byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\685                '+entry['name']+'_reg[byte_index*8 +: 8] <= reg_'+entry['name']+'_default_little[(C_S_AXI_DATA_WIDTH/8-byte_index-1)*8 +: 8];\n');686    if not(first_item):687        regsFile.write('        end\n\688        else begin\n\689            if (reg_wren) begin\n\690                case (axi_awaddr)\n');691    for entry in regsDict:692        if entry['type']=="WOE" :693            if entry['endian']=="little" :694                regsFile.write('\695                    //'+entry['name'].capitalize()+' Register\n\696                        `REG_'+entry['name'].upper()+'_ADDR : begin\n\697                                for ( byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\698                                    if (S_AXI_WSTRB[byte_index] == 1) begin\n\699                                        '+entry['name']+'_reg[byte_index*8 +: 8] <=  S_AXI_WDATA[byte_index*8 +: 8];\n\700                                    end\n\701                        end\n');702            if entry['endian']=="big" :703                regsFile.write('\704                    //'+entry['name'].capitalize()+' Register\n\705                        `REG_'+entry['name'].upper()+'_ADDR : begin\n\706                                for (byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\707                                    if (S_AXI_WSTRB[byte_index] == 1) begin\n\708                                        '+entry['name']+'_reg[byte_index*8 +: 8] <= S_AXI_WDATA[(C_S_AXI_DATA_WIDTH/8-byte_index-1)*8 +: 8]; //dynamic register;\n\709                                    end\n\710                        end\n');711    if not(first_item):712        regsFile.write('\713                endcase\n\714            end\n\715            else begin\n');716        717        for entry in regsDict:718            if entry['type']=="WOE" :719                if entry['endian']=="little" :720                    regsFile.write('\721                '+entry['name']+'_reg <= #1 `REG_'+entry['name'].upper()+'_DEFAULT;\n');722                if entry['endian']=="big" :723                    regsFile.write('\724                for (byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\725                        '+entry['name']+'_reg[byte_index*8 +: 8] <= reg_'+entry['name']+'_default_little[(C_S_AXI_DATA_WIDTH/8-byte_index-1)*8 +: 8];\n');726        regsFile.write('\727            end\n\728        end\n\729    end\n');730#Handle Read/write registers, not cleared731    first_item=True;732    for entry in regsDict:733        if first_item and (entry['type']=="RWS" or entry['type']=="RWA"):734            first_item = False;735            regsFile.write('\n\736//R/W register, not cleared\n\737    always @(posedge clk) begin\n\738        if (!resetn_sync) begin\n\739\n');740        if entry['type']=="RWS" :741            if entry['endian']=="little" :742                regsFile.write('\743            '+entry['name']+'_reg <= #1 `REG_'+entry['name'].upper()+'_DEFAULT;\n');744            if entry['endian']=="big" :745                regsFile.write('\746            for (byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\747                '+entry['name']+'_reg[byte_index*8 +: 8] <= reg_'+entry['name']+'_default_little[(C_S_AXI_DATA_WIDTH/8-byte_index-1)*8 +: 8];\n');748        if entry['type']=="RWA" :749            if entry['endian']=="little" :750                regsFile.write('\751            cpu2ip_'+entry['name']+'_reg <= #1 `REG_'+entry['name'].upper()+'_DEFAULT;\n');752            if entry['endian']=="big" :753                regsFile.write('\754            for (byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\755                cpu2ip_'+entry['name']+'_reg[byte_index*8 +: 8] <= reg_'+entry['name']+'_default_little[(C_S_AXI_DATA_WIDTH/8-byte_index-1)*8 +: 8];\n');756        if entry['type']=="RWSI" :757            if entry['endian']=="little" :758                regsFile.write('\759            '+entry['name']+'_reg <= #1 `REG_'+entry['name'].upper()+'_DEFAULT;\n');760            761        if entry['endian']=="big" :762                regsFile.write('\763            for (byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\764                '+entry['name']+'_reg[byte_index*8 +: 8] <= reg_'+entry['name']+'_default_little[(C_S_AXI_DATA_WIDTH/8-byte_index-1)*8 +: 8];\n');765            766        if entry['type']=="RWI" :      767            if entry['endian']=="little" :768                regsFile.write('\769            '+entry['name']+'_reg_internal <= #1 `REG_'+entry['name'].upper()+'_DEFAULT;\n');770            if entry['endian']=="big" :771                regsFile.write('\772             for (byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\773                '+entry['name']+'_reg_internal[byte_index*8 +: 8] <= reg_'+entry['name']+'_default_little[(C_S_AXI_DATA_WIDTH/8-byte_index-1)*8 +: 8];\n');774    if not(first_item):775        regsFile.write('\776        end\n\777        else begin\n\778           if (reg_wren) //write event\n\779            case (axi_awaddr)\n');780    for entry in regsDict:781        if entry['type']=="RWS" :782            if entry['endian']=="little" :783                regsFile.write('\784            //'+entry['name'].capitalize()+' Register\n\785                `REG_'+entry['name'].upper()+'_ADDR : begin\n\786                    for ( byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\787                        if (S_AXI_WSTRB[byte_index] == 1) begin\n\788                            '+entry['name']+'_reg[byte_index*8 +: 8] <=  S_AXI_WDATA[byte_index*8 +: 8]; //static register;\n\789                        end\n\790                end\n');791            if entry['endian']=="big" :792                regsFile.write('\793            //'+entry['name'].capitalize()+' Register\n\794                `REG_'+entry['name'].upper()+'_ADDR : begin\n\795                    for (byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\796                        if (S_AXI_WSTRB[byte_index] == 1) begin\n\797                            '+entry['name']+'_reg[byte_index*8 +: 8] <= S_AXI_WDATA[(C_S_AXI_DATA_WIDTH/8-byte_index-1)*8 +: 8]; //dynamic register;\n\798                        end\n\799                end\n');800                801        if entry['type']=="RWA" :802            if entry['endian']=="little" :803                regsFile.write('\804            //'+entry['name'].capitalize()+' Register\n\805                `REG_'+entry['name'].upper()+'_ADDR : begin\n\806                    for ( byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\807                        if (S_AXI_WSTRB[byte_index] == 1) begin\n\808                            cpu2ip_'+entry['name']+'_reg[byte_index*8 +: 8] <=  S_AXI_WDATA[byte_index*8 +: 8]; //dynamic register;\n\809                        end\n\810                end\n');811            if entry['endian']=="big" :812                regsFile.write('\813            //'+entry['name'].capitalize()+' Register\n\814                `REG_'+entry['name'].upper()+'_ADDR : begin\n\815                    for (byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\816                        if (S_AXI_WSTRB[byte_index] == 1) begin\n\817                            cpu2ip_'+entry['name']+'_reg[byte_index*8 +: 8] <= S_AXI_WDATA[(C_S_AXI_DATA_WIDTH/8-byte_index-1)*8 +: 8]; //dynamic register;\n\818                        end\n\819                end\n');820        if entry['type']=="RWSI" :821            if entry['endian']=="little" :822                regsFile.write('\823            //'+entry['name'].capitalize()+' Register\n\824                `REG_'+entry['name'].upper()+'_ADDR : begin\n\825                    for ( byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\826                        if (S_AXI_WSTRB[byte_index] == 1) begin\n\827                            '+entry['name']+'_reg[byte_index*8 +: 8] <=  S_AXI_WDATA[byte_index*8 +: 8]; //static register;\n\828                        end\n\829                end\n');830            if entry['endian']=="big" :831                regsFile.write('\832            //'+entry['name'].capitalize()+' Register\n\833                `REG_'+entry['name'].upper()+'_ADDR : begin\n\834                    for (byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\835                        if (S_AXI_WSTRB[byte_index] == 1) begin\n\836                            '+entry['name']+'_reg[byte_index*8 +: 8] <= S_AXI_WDATA[(C_S_AXI_DATA_WIDTH/8-byte_index-1)*8 +: 8]; //dynamic register;\n\837                        end\n\838                end\n');839        if entry['type']=="RWI" :840            if entry['endian']=="little" :841                regsFile.write('\842            //'+entry['name'].capitalize()+' Register\n\843                `REG_'+entry['name'].upper()+'_ADDR : begin\n\844                    for ( byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\845                        if (S_AXI_WSTRB[byte_index] == 1) begin\n\846                            '+entry['name']+'_reg_internal[byte_index*8 +: 8] <=  S_AXI_WDATA[byte_index*8 +: 8]; //static register;\n\847                        end\n\848                end\n');849            if entry['endian']=="big" :850                regsFile.write('\851            //'+entry['name'].capitalize()+' Register\n\852                `REG_'+entry['name'].upper()+'_ADDR : begin\n\853                    for (byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\854                        if (S_AXI_WSTRB[byte_index] == 1) begin\n\855                            '+entry['name']+'_reg_internal[byte_index*8 +: 8] <= S_AXI_WDATA[(C_S_AXI_DATA_WIDTH/8-byte_index-1)*8 +: 8]; //dynamic register;\n\856                        end\n\857                end\n');858    if not (first_item):859        regsFile.write('\860                default: begin\n\861                end\n\862\n\863            endcase\n\864        end\n');865                        866    for entry in regsDict:867       if entry['type']=="RWI" :868          regsFile.write('   '+entry['name']+'_reg_update <= reg_wren && (axi_awaddr == `REG_'+entry['name'].upper()+'_ADDR);\n');869    870    if not (first_item):871             regsFile.write('  end\n');872    873#Handle Read/write registers, clear on read874    first_item=True;875    for entry in regsDict:876        if entry['type']=="RWCR" :877            if first_item:878                first_item = False;879                regsFile.write('\n\880//R/W register, clear on read\n\881    always @(posedge clk) begin\n\882        if (!resetn_sync) begin\n\883\n');884            if entry['endian']=="little" :885                regsFile.write('\886            cpu2ip_'+entry['name']+'_reg <= #1 `REG_'+entry['name'].upper()+'_DEFAULT;\n');887            if entry['endian']=="big" :888                regsFile.write('\889            for (byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\890                cpu2ip_'+entry['name']+'_reg[byte_index*8 +: 8] <= reg_'+entry['name']+'_default_little[(C_S_AXI_DATA_WIDTH/8-byte_index-1)*8 +: 8];\n');891    if not (first_item):892        regsFile.write('\893        end\n\894        else begin\n\895            if (reg_wren)\n\896                case (axi_awaddr)\n');897    for entry in regsDict:898        if entry['type']=="RWCR" :899            if entry['endian']=="little" :900                regsFile.write('\901                    //'+entry['name'].capitalize()+' Register\n\902                    `REG_'+entry['name'].upper()+'_ADDR : begin\n\903                        for ( byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\904                            if (S_AXI_WSTRB[byte_index] == 1) begin\n\905                                cpu2ip_'+entry['name']+'_reg[byte_index*8 +: 8] <=  S_AXI_WDATA[byte_index*8 +: 8];\n\906                            end\n\907                    end\n');908            if entry['endian']=="big" :909                regsFile.write('\910                    //'+entry['name'].capitalize()+' Register\n\911                    `REG_'+entry['name'].upper()+'_ADDR : begin\n\912                        for (byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\913                            if (S_AXI_WSTRB[byte_index] == 1) begin\n\914                                cpu2ip_'+entry['name']+'_reg[byte_index*8 +: 8] <= S_AXI_WDATA[(C_S_AXI_DATA_WIDTH/8-byte_index-1)*8 +: 8]; //dynamic register;\n\915                            end\n\916                    end\n');917    if not(first_item):918        regsFile.write('\919                endcase\n\920        end\n\921    end\n\922\n\923\n\924//clear assertions\n\925    always @(posedge clk) begin\n\926        if (!resetn_sync) begin\n');927    for entry in regsDict:928        if entry['type']=="RWCR" :929            regsFile.write('\930            cpu2ip_'+entry['name']+'_reg_clear <=  #1 1\'b0;\n');931    if not(first_item):932        regsFile.write('\933        end\n\934        else begin\n');935    for entry in regsDict:936        if entry['type']=="RWCR" :937            regsFile.write('\938             cpu2ip_'+entry['name']+'_reg_clear <=  #1 reg_rden && (axi_awaddr==`REG_'+entry['name'].upper()+'_ADDR) ? 1\'b1 : 1\'b0;\n');939        940    if not(first_item):941        regsFile.write('\n\942        end\n\943    end\n');944#Handle Read/write registers, clear on write945    first_item= True;946    for entry in regsDict:947        if entry['type']=="RWCW" :948            first_item = False;949            regsFile.write('\n\950//R/W register, clear on write, dynamic\n\951// i.e. on write - write, next clock - write default value\n\952    always @(posedge clk) begin\n\953        if (!resetn_sync) begin\n');954            if entry['endian']=="little" :955                regsFile.write('\956            cpu2ip_'+entry['name']+'_reg <= #1 `REG_'+entry['name'].upper()+'_DEFAULT;\n');957            if entry['endian']=="big" :958                regsFile.write('\959            for (byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\960                cpu2ip_'+entry['name']+'_reg[byte_index*8 +: 8] <= reg_'+entry['name']+'_default_little[(C_S_AXI_DATA_WIDTH/8-byte_index-1)*8 +: 8];\n');961            regsFile.write('\962            cpu2ip_'+entry['name']+'_reg_clear_d <= #1 1\'b0;\n\963            cpu2ip_'+entry['name']+'_reg_clear   <= #1 1\'b0;\n');964    if not(first_item):965        regsFile.write('\966        end\n\967        else begin\n');968    for entry in regsDict:969        if entry['type']=="RWCW" :970            regsFile.write('\971            cpu2ip_'+entry['name']+'_reg_clear   <=  cpu2ip_'+entry['name']+'_reg_clear_d;\n\972            cpu2ip_'+entry['name']+'_reg_clear_d <=  reg_wren && (axi_awaddr==`REG_'+entry['name'].upper()+'_ADDR) ? 1\'b1 :  1\'b0;\n');973    if not(first_item):974        regsFile.write('\975            if (reg_wren) begin\n');976    for entry in regsDict:977        if entry['type']=="RWCW" :978            if entry['endian']=="little" :979                regsFile.write('\980                if (axi_awaddr==`REG_'+entry['name'].upper()+'_ADDR) begin\n\981                    for ( byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index+1 )\n\982                        if ( S_AXI_WSTRB[byte_index] == 1 ) begin\n\983                            cpu2ip_'+entry['name']+'_reg[byte_index*8 +: 8] <=  S_AXI_WDATA[byte_index*8 +: 8];\n\984                        end\n\985                end\n');986            if entry['endian']=="big" :987                regsFile.write('\988                if (axi_awaddr==`REG_'+entry['name'].upper()+'_ADDR) begin\n\989                    for (byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\990                        if (S_AXI_WSTRB[byte_index] == 1) begin\n\991                            cpu2ip_'+entry['name']+'_reg[byte_index*8 +: 8] <= S_AXI_WDATA[(C_S_AXI_DATA_WIDTH/8-byte_index-1)*8 +: 8]; //dynamic register;\n\992                        end\n\993                end\n');994    if not(first_item):995        regsFile.write('\996            end\n\997        end\n\998    end\n');999    regsFile.write('\1000\n\1001\n\1002\n\1003/////////////////////////\n\1004//// end of write\n\1005/////////////////////////\n');1006    regsFile.write('\n\1007    // Implement memory mapped register select and read logic generation\n\1008    // Slave register read enable is asserted when valid address is available\n\1009    // and the slave is ready to accept the read address.\n\1010\n\1011    // reg_rden control logic\n\1012    // temperary no extra logic here\n\1013    assign reg_rden = axi_arready & S_AXI_ARVALID & ~axi_rvalid;\n');1014#return read data 1015    regsFile.write('\n\1016    always @(*)\n\1017    begin\n\1018\n\1019        case ( axi_araddr /*S_AXI_ARADDR ^ C_BASE_ADDRESS*/)\n');1020    1021    for entry in regsDict:1022        if  entry['type']=="RO" or entry['type']=="ROC" or entry['type']=="RWS" or entry['type']=="RWI" or entry['type']=="RWSI" or entry['type']=="ROI":1023            if entry['endian']=="little" :1024                regsFile.write('\1025            //'+entry['name'].capitalize()+' Register\n\1026            `REG_'+entry['name'].upper()+'_ADDR : begin\n\1027                reg_data_out [`REG_'+entry['name'].upper()+'_BITS] =  '+entry['name']+'_reg;\n');1028                1029            if entry['endian']=="big" :1030                regsFile.write('\1031            //'+entry['name'].capitalize()+' Register\n\1032            `REG_'+entry['name'].upper()+'_ADDR : begin\n\1033                for (byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\1034                    reg_data_out [byte_index*8 +: 8] = '+entry['name']+'_reg [(C_S_AXI_DATA_WIDTH/8-byte_index-1)*8 +: 8];\n');1035            if int(entry['width'])<32:1036                regsFile.write('\1037                reg_data_out [31:`REG_'+entry['name'].upper()+'_WIDTH] =  \'b0;\n');1038            1039            regsFile.write('\1040            end\n');1041        1042        if entry['type']=="RWCW" or entry['type']=="RWA" or entry['type']=="RWCR":1043            if entry['endian']=="little" :1044                regsFile.write('\1045            //'+entry['name'].capitalize()+' Register\n\1046            `REG_'+entry['name'].upper()+'_ADDR : begin\n\1047                reg_data_out [`REG_'+entry['name'].upper()+'_BITS] =  ip2cpu_'+entry['name']+'_reg;\n');1048                1049            if entry['endian']=="big" :1050                regsFile.write('\1051            //'+entry['name'].capitalize()+' Register\n\1052            `REG_'+entry['name'].upper()+'_ADDR : begin\n\1053                for (byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\1054                    reg_data_out [byte_index*8 +: 8] = ip2cpu_'+entry['name']+'_reg[(C_S_AXI_DATA_WIDTH/8-byte_index-1)*8 +: 8];\n');1055            1056            if int(entry['width']) < 32 :1057                regsFile.write('\1058                reg_data_out [31:`REG_'+entry['name'].upper()+'_WIDTH] =  \'b0;\n');1059            1060            regsFile.write('\1061            end\n');1062    1063    regsFile.write('\1064            //Default return value\n\1065            default: begin\n\1066                reg_data_out [31:0] =  32\'hDEADBEEF;\n\1067            end\n\1068\n\1069        endcase\n\1070\n\1071    end//end of assigning data to IP2Bus_Data bus\n');1072#Handle read only registers1073    first_item=True;1074    for entry in regsDict:1075        if entry['type']=="ROC" :1076            if first_item:1077                first_item=False;1078                regsFile.write('\n\1079    //Read only registers, not cleared\n\1080    //Nothing to do here....\n\1081\n\1082//Read only registers, cleared on read (e.g. counters)\n\1083    always @(posedge clk)\n\1084    if (!resetn_sync) begin\n');1085            regsFile.write('\1086        '+entry['name']+'_reg_clear <= #1 1\'b0;\n\1087        '+entry['name']+'_reg_clear_d <= #1 1\'b0;\n');1088    if not(first_item):1089        regsFile.write('    end\n\1090    else begin\n');1091    for entry in regsDict:1092        if entry['type']=="ROC" :1093            regsFile.write('\1094        '+entry['name']+'_reg_clear <= #1 '+entry['name']+'_reg_clear_d;\n\1095        '+entry['name']+'_reg_clear_d <= #1(reg_rden && (axi_araddr==`REG_'+entry['name'].upper()+'_ADDR)) ? 1\'b1 : 1\'b0;\n');1096    if not(first_item):1097        regsFile.write('    end\n\n');1098    regsFile.write('\n\1099// Output register or memory read data\n\1100    always @( posedge S_AXI_ACLK )\n\1101    begin\n\1102      if ( S_AXI_ARESETN == 1\'b0 )\n\1103        begin\n\1104          axi_rdata  <= 0;\n\1105        end\n\1106      else\n\1107        begin\n\1108          // When there is a valid read address (S_AXI_ARVALID) with\n\1109          // acceptance of read address by the slave (axi_arready),\n\1110          // output the read dada\n\1111          if (reg_rden)\n\1112            begin\n\1113              axi_rdata <= reg_data_out/*ip2bus_data*/;     // register read data /* some new changes here */\n\1114            end\n\1115        end\n\1116    end\n');1117# end of write_logic1118##################################################################1119# a function that writes the logic behind the indirect registers access1120##################################################################1121def write_indirect(regsFile,memsDict):1122  regsFile.write('\n\1123    //////////////////////////////////\n\1124    // Implement Indirect Access\n\1125	//////////////////////////////////\n\1126	\n');1127	1128  regsFile.write('\n\1129  //--------------------- Internal Parameters-------------------------\n\1130   localparam NUM_INDIRECT_STATES                = 6;\n\1131   localparam IDLE_INDIRECT_STATE                = 1;\n\1132   localparam WRITE_INDIRECT_STATE               = 2;\n\1133   localparam WRITE_WAIT_INDIRECT_STATE          = 4;\n\1134   localparam READ_INDIRECT_STATE                = 8;\n\1135   localparam READ_WAIT_INDIRECT_STATE           = 16;\n\1136   localparam INDIRECT_DONE_STATE                = 32;\n\1137   localparam INDIRECT_WRITE                     = 0;\n\1138   localparam INDIRECT_READ                      = 1;\n\1139   localparam INDIRECT_WRITE_TA                  = 1;\n\1140   localparam INDIRECT_WRITE_WS                  = 0;\n\1141  //------------------------------------------------------------------\n\1142   \n\1143   reg  [NUM_INDIRECT_STATES-1:0]           indirect_state, indirect_state_next, indirect_state_last;\n\1144   wire                            indirect_trigger;\n\1145   wire                            indirect_type;\n\1146   reg                             indirect_status, indirect_status_next;\n\1147   wire [3:0]                      indirect_address_increment;\n\1148   wire                            indirect_write_type;\n\1149   wire [10:0]                     indirect_timeout;\n\1150   wire [15:0]                     indirect_repeat_count;\n\1151   reg  [15:0]                     indirect_remaining,indirect_remaining_next;\n\1152   reg  [10:0]                     indirect_timeout_count, indirect_timeout_count_next;\n\1153   reg                             indirect_reply_valid;\n\1154   reg  [31:0]                     indirect_address,indirect_address_next;\n\1155   reg  [3:0]                      indirect_memory_select,indirect_memory_select_next;\n\1156   wire                             indirect_command_done;\n\1157   \n\1158   assign   indirect_trigger = indirectcommand_reg[0];\n\1159   assign   indirect_type    = indirectcommand_reg[4];\n\1160   assign   indirect_address_increment = indirectconfig_reg[3:0];\n\1161   assign   indirect_write_type = indirectconfig_reg[4];\n\1162   assign   indirect_timeout    = indirectconfig_reg[15:5];\n\1163   assign   indirect_repeat_count = indirectconfig_reg[31:16];\n\1164   \n\1165 always @(*) begin\n\1166      indirect_state_next   = indirect_state;\n\1167      indirect_status_next  = indirect_status;\n\1168      indirect_remaining_next = indirect_remaining;\n\1169      indirect_timeout_count_next = indirect_timeout_count;\n\1170      indirect_address_next      = indirect_address;\n\1171      indirect_memory_select_next = indirect_memory_select;\n\1172      case(indirect_state)\n\1173        IDLE_INDIRECT_STATE: begin\n\1174     	   if(indirect_trigger) begin\n\1175     	      indirect_state_next= (indirect_type == INDIRECT_WRITE) ? WRITE_INDIRECT_STATE : READ_INDIRECT_STATE;\n\1176     	      indirect_remaining_next = (indirect_repeat_count == 0) ? 16\'h1 : indirect_repeat_count;\n\1177     	      indirect_timeout_count_next   = indirect_timeout;\n\1178     	      indirect_address_next   =  indirectaddress_reg; //This is the address in the user register\n\1179     	      indirect_memory_select_next = indirectaddress_reg[31:28];\n\1180     	   end\n\1181	    end\n\1182	    \n\1183	    READ_INDIRECT_STATE: begin\n\1184		     indirect_state_next = READ_WAIT_INDIRECT_STATE;\n\1185	    end\n\1186	    READ_WAIT_INDIRECT_STATE: begin\n\1187	         if (indirect_reply_valid) begin\n\1188	            indirect_state_next = INDIRECT_DONE_STATE;\n\1189	            indirect_status_next =0;\n\1190	         end\n\1191	         if (indirect_timeout_count==0) begin\n\1192	            indirect_state_next = INDIRECT_DONE_STATE;\n\1193	            indirect_status_next = 1; \n\1194	         end\n\1195	         indirect_timeout_count_next = indirect_timeout_count-1;\n\1196	     end\n\1197	     WRITE_INDIRECT_STATE: begin\n\1198	         indirect_state_next = WRITE_WAIT_INDIRECT_STATE;\n\1199	     end\n\1200	     WRITE_WAIT_INDIRECT_STATE:  begin\n\1201	         if (((indirect_write_type == INDIRECT_WRITE_TA) && (indirect_reply_valid)) || ((indirect_write_type == INDIRECT_WRITE_WS) && (indirect_timeout_count==0))) begin\n\1202	           indirect_remaining_next = indirect_remaining - 1;\n\1203	           indirect_address_next = indirect_address+indirect_address_increment;\n\1204	           if (indirect_remaining==1) begin\n\1205	              indirect_state_next = INDIRECT_DONE_STATE;\n\1206	           end\n\1207	         end\n\1208	         else \n\1209	           if (indirect_timeout_count==0) begin\n\1210	         	indirect_state_next = INDIRECT_DONE_STATE;\n\1211	         	indirect_status_next = 1; \n\1212	         end\n\1213             indirect_timeout_count_next = indirect_timeout_count==0 ? 0 : indirect_timeout_count-1;\n\1214	     end\n\1215	     INDIRECT_DONE_STATE: begin\n\1216	        indirect_state_next= IDLE_INDIRECT_STATE;\n\1217	     end\n\1218	     default: begin\n\1219	         indirect_state_next= IDLE_INDIRECT_STATE;\n\1220	     end\n\1221      endcase // case(state)\n\1222   end // always @ (*)\n\1223   \n\1224    assign indirect_command_done = (indirect_state==INDIRECT_DONE_STATE);\n\1225   \n\1226   always @(posedge clk) begin\n\1227      if(~resetn_sync) begin\n\1228         indirect_state <= #1 IDLE_INDIRECT_STATE;\n\1229         indirect_state_last <= #1 IDLE_INDIRECT_STATE;\n\1230         indirect_status <= #1 1\'b0;\n\1231         indirect_remaining <= #1 0;\n\1232         indirect_timeout_count <= #1 0;\n\1233         indirect_address   <= #1 0;\n\1234         indirect_memory_select <= #1 0;\n\1235         indirectcommand_reg <= #1 `REG_INDIRECTCOMMAND_DEFAULT;\n\1236      end\n\1237      else begin\n\1238         indirect_state <= #1 indirect_state_next;\n\1239         indirect_state_last <= #1 indirect_state;\n\1240         indirect_status <= #1 indirect_status_next;\n\1241         indirect_remaining <= #1 indirect_remaining_next;\n\1242         indirect_timeout_count <= #1 indirect_timeout_count_next;\n\1243         indirect_address   <= #1  indirect_address_next;\n\1244         indirect_memory_select <= #1 indirect_memory_select_next;\n\1245         indirectcommand_reg <= #1  indirect_command_done ? {indirect_status,indirectcommand_reg[7:4],4\'h0} : \n\1246                                    indirectcommand_reg_update ? indirectcommand_reg_internal: \n\1247                                    indirectcommand_reg;\n\1248      end\n\1249   end   \n\1250   \n');1251  for entry in memsDict:1252     regsFile.write('\n\1253       \n\1254       always @(posedge clk) begin\n\1255         if  (~resetn_sync) begin\n\1256           '+entry['name']+'_addr <= #1 0;\n\1257           '+entry['name']+'_data <= #1 0;\n\1258           '+entry['name']+'_rd_wrn<= #1 0;\n\1259           '+entry['name']+'_cmd_valid <= #1 0;\n\1260         end \n\1261         else begin\n\1262           '+entry['name']+'_addr <= #1 indirect_address;\n\1263           '+entry['name']+'_data <= #1 indirectwrdata_reg;\n\1264           '+entry['name']+'_rd_wrn<= #1 indirect_type;\n\1265           '+entry['name']+'_cmd_valid <= #1 ('+entry['address']+'==(indirect_memory_select<<28)) && ((indirect_state == WRITE_INDIRECT_STATE) || (indirect_state == READ_INDIRECT_STATE));\n\1266         end \n\1267       end\n');1268       1269  regsFile.write('\n\1270       always @(posedge clk) begin\n\1271          if  (~resetn_sync) begin\n\1272             indirectreply_reg <= #1 0;\n\1273             indirect_reply_valid <= #1 0; \n\1274          end \n\1275          else begin \n\1276             indirectreply_reg <= #1 ' );1277  for entry in memsDict:1278      regsFile.write(entry['address']+'==(indirect_memory_select<<28) ? '+entry['name']+'_reply :');1279  regsFile.write(' 0;\n\1280      indirect_reply_valid <= #1 ');1281  for entry in memsDict:1282      regsFile.write(entry['address']+'==(indirect_memory_select<<28) ? '+entry['name']+'_reply_valid :');1283  regsFile.write(' 0;\n\1284          end \n\1285        end\n\1286  \n');1287# end of write_indirect1288##################################################################1289#write all the defines to the defs module1290##################################################################1291def write_defines(defsFile,regsDict, memsDict):1292   for entry in regsDict:1293      defsFile.write(	'\n`define  REG_'+entry['name'].upper()+'_BITS\t\t\t\t'+entry['bits']+1294			'\n`define  REG_'+entry['name'].upper()+'_WIDTH\t\t\t\t'+entry['width']+1295			'\n`define  REG_'+entry['name'].upper()+'_DEFAULT\t\t\t\t'+entry['default']+1296			'\n`define  REG_'+entry['name'].upper()+'_ADDR\t\t\t\t'+entry['addr']+'\n');1297   for entry in memsDict:1298      defsFile.write(	'\n`define  MEM_'+entry['name'].upper()+'_DATA_BITS\t\t\t\t'+entry['data_bits']+1299			'\n`define  MEM_'+entry['name'].upper()+'_ADDR_BITS\t\t\t\t'+entry['addr_bits']+1300			'\n`define  MEM_'+entry['name'].upper()+'_WIDTH\t\t\t\t'+entry['width']+1301			'\n`define  MEM_'+entry['name'].upper()+'_DEPTH\t\t\t\t'+str(2**(int(entry['addr_bits'].split(':')[0])+1))+1302			'\n`define  MEM_'+entry['name'].upper()+'_ADDR\t\t\t\t'+entry['address']+'\n');1303 1304#end of write_defines1305##################################################################1306#write all the register offsets to the h template (to be included)1307##################################################################1308def write_h(hFile,regsDict,memsDict):1309   hFile.write('##########This text should be copied to the head file #############\n\1310   #Registers offset definitions\n\n');1311   1312   for entry in regsDict:1313      hFile.write('#define SUME_'+block_name+'_'+entry['name'].upper()+'_0_OFFSET 0x'+entry['addr'][4:]+'\n');1314      hFile.write('#define SUME_'+block_name+'_'+entry['name'].upper()+'_0_DEFAULT 0x'+entry['default'].split("'h")[-1]+'\n');1315      hFile.write('#define SUME_'+block_name+'_'+entry['name'].upper()+'_0_WIDTH '+entry['width']+'\n');1316   for entry in memsDict:1317     hFile.write('#define SUME_'+block_name+'_MEM_'+entry['name'].upper()+'_0_WIDTH '+entry['width']+'\n');1318     hFile.write('#define SUME_'+block_name+'_MEM_'+entry['name'].upper()+'_0_DEPTH '+str(2**(int(entry['addr_bits'].split(':')[0])+1))+'\n');1319     hFile.write('#define SUME_'+block_name+'_MEM_'+entry['name'].upper()+'_0_ADDRESS 0x'+entry['address'].split("'h")[-1]+'\n');1320#end of write_h1321##################################################################1322#write all the register offsets to the tcl file1323##################################################################1324def write_tcl(tclFile,regsDict,memsDict):1325   for entry in regsDict:1326     tclFile.write('set '+block_name+'_REGS_'+entry['name'].upper()+'_0_OFFSET 0x'+entry['addr'][4:]+'\n');1327     tclFile.write('set '+block_name+'_REGS_'+entry['name'].upper()+'_0_DEFAULT 0x'+entry['default'].split("'h")[-1]+'\n');1328     tclFile.write('set '+block_name+'_REGS_'+entry['name'].upper()+'_0_WIDTH '+entry['width']+'\n');1329   for entry in memsDict:1330     tclFile.write('set '+block_name+'_MEM_'+entry['name'].upper()+'_0_WIDTH '+entry['width']+'\n');1331     tclFile.write('set '+block_name+'_MEM_'+entry['name'].upper()+'_0_DEPTH '+str(2**(int(entry['addr_bits'].split(':')[0])+1))+'\n');1332     tclFile.write('set '+block_name+'_MEM_'+entry['name'].upper()+'_0_ADDRESS 0x'+entry['address'].split("'h")[-1]+'\n');1333     1334#end of write_tcl1335##################################################################1336#write all the register offsets to table1337##################################################################1338def write_tb(tbFile,regsDict,memsDict):1339   for entry in regsDict:1340      tbFile.write('#define SUME '+block_name+' '+entry['name'].upper()+' OFFSET 0x'+entry['addr'][4:]+'\n');1341      tbFile.write('#define SUME '+block_name+' '+entry['name'].upper()+' DEFAULT 0x'+entry['default'].split("'h")[-1]+'\n');1342      tbFile.write('#define SUME '+block_name+' '+entry['name'].upper()+' WIDTH '+entry['width']+'\n');1343   for entry in memsDict:1344      tbFile.write('#define  SUME '+block_name+' MEM_'+entry['name'].upper()+' WIDTH '+entry['width']+'\n');1345      tbFile.write('#define  SUME '+block_name+' MEM_'+entry['name'].upper()+' DEPTH '+str(2**(int(entry['addr_bits'].split(':')[0])+1))+'\n');1346      tbFile.write('#define  SUME '+block_name+' MEM_'+entry['name'].upper()+' ADDRESS 0x'+entry['address'].split("'h")[-1]+'\n');1347#end of write_tb1348##################################################################1349#write top module's template (i.e. include this in your module)1350##################################################################1351def write_module_template(moduleFile,regsDict,memsDict):1352#first write static inclusions....1353  moduleFile.write('`include "'+module_name+'_cpu_regs_defines.v"\n\1354\n\1355//parameters to be added to the top module parameters\n\1356#(\n\1357    // AXI Registers Data Width\n\1358    parameter C_S_AXI_DATA_WIDTH    = 32,\n\1359    parameter C_S_AXI_ADDR_WIDTH    = 32\n\1360)\n\1361//ports to be added to the top module ports\n\1362(\n\1363// Signals for AXI_IP and IF_REG (Added for debug purposes)\n\1364    // Slave AXI Ports\n\1365    input                                     S_AXI_ACLK,\n\1366    input                                     S_AXI_ARESETN,\n\1367    input      [C_S_AXI_ADDR_WIDTH-1 : 0]     S_AXI_AWADDR,\n\1368    input                                     S_AXI_AWVALID,\n\1369    input      [C_S_AXI_DATA_WIDTH-1 : 0]     S_AXI_WDATA,\n\1370    input      [C_S_AXI_DATA_WIDTH/8-1 : 0]   S_AXI_WSTRB,\n\1371    input                                     S_AXI_WVALID,\n\1372    input                                     S_AXI_BREADY,\n\1373    input      [C_S_AXI_ADDR_WIDTH-1 : 0]     S_AXI_ARADDR,\n\1374    input                                     S_AXI_ARVALID,\n\1375    input                                     S_AXI_RREADY,\n\1376    output                                    S_AXI_ARREADY,\n\1377    output     [C_S_AXI_DATA_WIDTH-1 : 0]     S_AXI_RDATA,\n\1378    output     [1 : 0]                        S_AXI_RRESP,\n\1379    output                                    S_AXI_RVALID,\n\1380    output                                    S_AXI_WREADY,\n\1381    output     [1 :0]                         S_AXI_BRESP,\n\1382    output                                    S_AXI_BVALID,\n\1383    output                                    S_AXI_AWREADY\n\1384)\n\n');1385  first_item = True;1386  for entry in regsDict:1387    if first_item and (entry['endian']=="big") :1388        first_item = False;1389        moduleFile.write('\n\1390    // define and assign default little endian\n');1391  for entry in regsDict:1392     if entry['endian']=="big" :1393            moduleFile.write('\1394    wire                                      reg_'+entry['name']+'_default_little;\n');1395  for entry in regsDict:1396     if entry['endian']=="big" :1397            moduleFile.write('\1398    assign  reg_'+entry['name']+'_default_little = `REG_'+entry['name'].upper()+'_DEFAULT;\n');1399#then add design specific wires/regs:1400  moduleFile.write('\n\1401    // define registers\n');1402  for entry in regsDict:1403     if entry['type']=="RO" :1404       moduleFile.write('    reg      [`REG_'+(entry['name']).upper()+'_BITS]    '+entry['name']+'_reg;\n')1405     if entry['type']=="ROC" :1406       moduleFile.write('    reg      [`REG_'+(entry['name']).upper()+'_BITS]    '+entry['name']+'_reg;\n')1407       moduleFile.write('    wire                             '+entry['name']+'_reg_clear;\n')1408     if entry['type']=="RWS" :1409       moduleFile.write('    wire     [`REG_'+(entry['name']).upper()+'_BITS]    '+entry['name']+'_reg;\n')1410     if entry['type']=="WO" :1411       moduleFile.write('    wire     [`REG_'+(entry['name']).upper()+'_BITS]    '+entry['name']+'_reg;\n')1412     if entry['type']=="WOE" :1413       moduleFile.write('    wire     [`REG_'+(entry['name']).upper()+'_BITS]    '+entry['name']+'_reg;\n')1414     if entry['type']=="RWA" :1415       moduleFile.write('    reg      [`REG_'+(entry['name']).upper()+'_BITS]    ip2cpu_'+entry['name']+'_reg;\n')1416       moduleFile.write('    wire     [`REG_'+(entry['name']).upper()+'_BITS]    cpu2ip_'+entry['name']+'_reg;\n')1417     if entry['type']=="RWCR" :1418       moduleFile.write('    reg      [`REG_'+(entry['name']).upper()+'_BITS]    ip2cpu_'+entry['name']+'_reg;\n')1419       moduleFile.write('    wire     [`REG_'+(entry['name']).upper()+'_BITS]    cpu2ip_'+entry['name']+'_reg;\n')1420       moduleFile.write('    wire                             cpu2ip_'+entry['name']+'_reg_clear;\n')1421     if entry['type']=="RWCW" :1422       moduleFile.write('    reg      [`REG_'+(entry['name']).upper()+'_BITS]    ip2cpu_'+entry['name']+'_reg;\n')1423       moduleFile.write('    wire     [`REG_'+(entry['name']).upper()+'_BITS]    cpu2ip_'+entry['name']+'_reg;\n')1424       moduleFile.write('    wire                             cpu2ip_'+entry['name']+'_reg_clear;\n')1425       moduleFile.write('    wire                             cpu2ip_'+entry['name']+'_reg_clear_d;\n')1426  for entry in memsDict:1427       moduleFile.write('    wire      [`MEM_'+(entry['name']).upper()+'_ADDR_BITS]    '+entry['name']+'_addr;\n')1428       moduleFile.write('    wire      [`MEM_'+(entry['name']).upper()+'_DATA_BITS]    '+entry['name']+'_data;\n')1429       moduleFile.write('    wire                              '+entry['name']+'_rd_wrn;\n')1430       moduleFile.write('    wire                              '+entry['name']+'_cmd_valid;\n')1431       moduleFile.write('    reg       [`MEM_'+(entry['name']).upper()+'DATA_BITS]    '+entry['name']+'_reply;\n')1432       moduleFile.write('    reg                               '+entry['name']+'_reply_valid;\n')       1433#instantiate registers module1434  moduleFile.write('\n//Registers section\n\1435 '+module_name+'_cpu_regs\n\1436 #(\n\1437     .C_BASE_ADDRESS        (C_BASEADDR ),\n\1438     .C_S_AXI_DATA_WIDTH    (C_S_AXI_DATA_WIDTH),\n\1439     .C_S_AXI_ADDR_WIDTH    (C_S_AXI_ADDR_WIDTH)\n\1440 ) '+module_name+'_cpu_regs_inst\n\1441 (\n\1442   // General ports\n\1443    .clk                    (axis_aclk),\n\1444    .resetn                 (axis_resetn),\n\1445   // AXI Lite ports\n\1446    .S_AXI_ACLK             (S_AXI_ACLK),\n\1447    .S_AXI_ARESETN          (S_AXI_ARESETN),\n\1448    .S_AXI_AWADDR           (S_AXI_AWADDR),\n\1449    .S_AXI_AWVALID          (S_AXI_AWVALID),\n\1450    .S_AXI_WDATA            (S_AXI_WDATA),\n\1451    .S_AXI_WSTRB            (S_AXI_WSTRB),\n\1452    .S_AXI_WVALID           (S_AXI_WVALID),\n\1453    .S_AXI_BREADY           (S_AXI_BREADY),\n\1454    .S_AXI_ARADDR           (S_AXI_ARADDR),\n\1455    .S_AXI_ARVALID          (S_AXI_ARVALID),\n\1456    .S_AXI_RREADY           (S_AXI_RREADY),\n\1457    .S_AXI_ARREADY          (S_AXI_ARREADY),\n\1458    .S_AXI_RDATA            (S_AXI_RDATA),\n\1459    .S_AXI_RRESP            (S_AXI_RRESP),\n\1460    .S_AXI_RVALID           (S_AXI_RVALID),\n\1461    .S_AXI_WREADY           (S_AXI_WREADY),\n\1462    .S_AXI_BRESP            (S_AXI_BRESP),\n\1463    .S_AXI_BVALID           (S_AXI_BVALID),\n\1464    .S_AXI_AWREADY          (S_AXI_AWREADY),\n\1465\n\1466   // Register ports\n');1467  for entry in regsDict:1468     if entry['type']=="RO"  :1469       moduleFile.write('   .'+entry['name']+'_reg          ('+entry['name']+'_reg),\n')1470     if entry['type']=="ROC" :1471       moduleFile.write('   .'+entry['name']+'_reg          ('+entry['name']+'_reg),\n')1472       moduleFile.write('   .'+entry['name']+'_reg_clear    ('+entry['name']+'_reg_clear),\n')1473     if entry['type']=="RWS" :1474       moduleFile.write('   .'+entry['name']+'_reg          ('+entry['name']+'_reg),\n')1475     if entry['type']=="WO" :1476       moduleFile.write('   .'+entry['name']+'_reg          ('+entry['name']+'_reg),\n')1477     if entry['type']=="WOE" :1478       moduleFile.write('   .'+entry['name']+'_reg          ('+entry['name']+'_reg),\n')1479     if entry['type']=="RWA" :1480       moduleFile.write('   .ip2cpu_'+entry['name']+'_reg          (ip2cpu_'+entry['name']+'_reg),\n')1481       moduleFile.write('   .cpu2ip_'+entry['name']+'_reg          (cpu2ip_'+entry['name']+'_reg),\n')1482     if entry['type']=="RWCR" :1483       moduleFile.write('   .ip2cpu_'+entry['name']+'_reg          (ip2cpu_'+entry['name']+'_reg),\n')1484       moduleFile.write('   .cpu2ip_'+entry['name']+'_reg          (cpu2ip_'+entry['name']+'_reg),\n')1485       moduleFile.write('   .cpu2ip_'+entry['name']+'_reg_clear    (cpu2ip_'+entry['name']+'_reg_clear),\n')1486     if entry['type']=="RWCW" :1487       moduleFile.write('   .ip2cpu_'+entry['name']+'_reg          (ip2cpu_'+entry['name']+'_reg),\n')1488       moduleFile.write('   .cpu2ip_'+entry['name']+'_reg          (cpu2ip_'+entry['name']+'_reg),\n')1489       moduleFile.write('   .cpu2ip_'+entry['name']+'_reg_clear    (cpu2ip_'+entry['name']+'_reg_clear),\n')1490  for entry in memsDict:1491       moduleFile.write('    .'+entry['name']+'_addr          ('+entry['name']+'_addr),\n')1492       moduleFile.write('    .'+entry['name']+'_data          ('+entry['name']+'_data),\n')1493       moduleFile.write('    .'+entry['name']+'_rd_wrn        ('+entry['name']+'_rd_wrn),\n')1494       moduleFile.write('    .'+entry['name']+'_cmd_valid     ('+entry['name']+'_cmd_valid ),\n')1495       moduleFile.write('    .'+entry['name']+'_reply         ('+entry['name']+'_reply),\n')1496       moduleFile.write('    .'+entry['name']+'_reply_valid   ('+entry['name']+'_reply_valid),\n')       1497  moduleFile.write('   // Global Registers - user can select if to use\n\1498   .cpu_resetn_soft(),//software reset, after cpu module\n\1499   .resetn_soft    (),//software reset to cpu module (from central reset management)\n\1500   .resetn_sync    (resetn_sync)//synchronized reset, use for better timing\n\1501);\n\1502//registers logic, current logic is just a placeholder for initial compil, required to be changed by the user\n');1503#registers logic1504  moduleFile.write('always @(posedge axis_aclk)\n\1505	if (~resetn_sync) begin\n');1506  for entry in regsDict:1507     if entry['type']=="RO"  :1508       if entry['endian']=="little":1509         moduleFile.write('\1510        '+entry['name']+'_reg <= #1    `REG_'+entry['name'].upper()+'_DEFAULT;\n');1511       if entry['endian']=="big":1512         moduleFile.write('\1513        for (byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\1514            '+entry['name']+'_reg[byte_index*8 +: 8] <= reg_'+entry['name']+'_default_little[(C_S_AXI_DATA_WIDTH/8-byte_index-1)*8 +: 8];\n');1515     if entry['type']=="ROC" :1516       if entry['endian']=="little":1517         moduleFile.write('\1518        '+entry['name']+'_reg <= #1    `REG_'+entry['name'].upper()+'_DEFAULT;\n');1519       if entry['endian']=="big":1520         moduleFile.write('\1521        for (byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\1522            '+entry['name']+'_reg[byte_index*8 +: 8] <= reg_'+entry['name']+'_default_little[(C_S_AXI_DATA_WIDTH/8-byte_index-1)*8 +: 8];\n');1523     if entry['type']=="RWA" :1524       if entry['endian']=="little":1525         moduleFile.write('\1526        ip2cpu_'+entry['name']+'_reg <= #1    `REG_'+entry['name'].upper()+'_DEFAULT;\n');1527       if entry['endian']=="big":1528         moduleFile.write('\1529        for (byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\1530            ip2cpu_'+entry['name']+'_reg[byte_index*8 +: 8] <= reg_'+entry['name']+'_default_little[(C_S_AXI_DATA_WIDTH/8-byte_index-1)*8 +: 8];\n');1531     if entry['type']=="RWCR" :1532       if entry['endian']=="little":1533         moduleFile.write('\1534        ip2cpu_'+entry['name']+'_reg <= #1    `REG_'+entry['name'].upper()+'_DEFAULT;\n');1535       if entry['endian']=="big":1536         moduleFile.write('\1537        for (byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\1538            ip2cpu_'+entry['name']+'_reg[byte_index*8 +: 8] <= reg_'+entry['name']+'_default_little[(C_S_AXI_DATA_WIDTH/8-byte_index-1)*8 +: 8];\n');1539     if entry['type']=="RWCW" :1540       if entry['endian']=="little":1541         moduleFile.write('\1542        ip2cpu_'+entry['name']+'_reg <= #1    `REG_'+entry['name'].upper()+'_DEFAULT;\n');1543       if entry['endian']=="big":1544         moduleFile.write('\1545        for (byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\1546            ip2cpu_'+entry['name']+'_reg[byte_index*8 +: 8] <= reg_'+entry['name']+'_default_little[(C_S_AXI_DATA_WIDTH/8-byte_index-1)*8 +: 8];\n');1547       moduleFile.write('		cpu_'+entry['name']+'_reg_clear_d <= #1    \'h0\n;')1548      1549  moduleFile.write('	end\n\1550	else begin\n')1551  for entry in regsDict:1552     if entry['type']=="RO"  :1553       if entry['endian']=="little":1554         moduleFile.write('\1555        '+entry['name']+'_reg <= #1    `REG_'+entry['name'].upper()+'_DEFAULT;\n');1556       if entry['endian']=="big":1557         moduleFile.write('\1558        for (byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\1559            '+entry['name']+'_reg[byte_index*8 +: 8] <= reg_'+entry['name']+'_default_little[(C_S_AXI_DATA_WIDTH/8-byte_index-1)*8 +: 8];\n');1560     if entry['type']=="ROC" :1561       if entry['endian']=="little":1562         moduleFile.write('\1563        '+entry['name']+'_reg <= #1 '+entry['name']+'_reg_clear ? \'h0  : `REG_'+entry['name'].upper()+'_DEFAULT;\n');1564       if entry['endian']=="big":1565         moduleFile.write('\1566        if ('+entry['name']+'_reg_clear == 1\'b1) \n\1567            '+entry['name']+'_reg <= #1 \'h0;\n\1568        else\n\1569            for (byte_index = 0; byte_index <= (`REG_'+entry['name'].upper()+'_WIDTH/8-1); byte_index = byte_index +1)\n\1570                '+entry['name']+'_reg[byte_index*8 +: 8] <= reg_'+entry['name']+'_default_little[(C_S_AXI_DATA_WIDTH/8-byte_index-1)*8 +: 8];\n');1571     if entry['type']=="RWA" :1572       moduleFile.write('		ip2cpu_'+entry['name']+'_reg <= #1 cpu2ip_'+entry['name']+'_reg;\n')1573     if entry['type']=="RWCR" :1574       if entry['endian']=="little":1575         moduleFile.write('\1576        ip2cpu_'+entry['name']+'_reg <= #1 '+entry['name']+'_reg_clear ? \'h0  : `REG_'+entry['name'].upper()+'_DEFAULT;\n');1577       if entry['endian']=="big":1578         moduleFile.write('\1579        if ('+entry['name']+'_reg_clear == 1\'b1) \n\1580            '+entry['name']+'_reg <= #1 \'h0;\n\1581        else\n\1582            ip2cpu_'+entry['name']+'_reg <= #1 cpu2ip_'+entry['name']+'_reg;');1583     if entry['type']=="RWCW" :1584       if entry['endian']=="little":1585         moduleFile.write('\1586        ip2cpu_'+entry['name']+'_reg <= #1 '+entry['name']+'_reg_clear ? \'h0  : `REG_'+entry['name'].upper()+'_DEFAULT;\n');1587       if entry['endian']=="big":1588         moduleFile.write('\1589        if ('+entry['name']+'_reg_clear_d == 1\'b1) \n\1590            ip2cpu_'+entry['name']+'_reg <= #1 \'h0;\n\1591        else\n\1592            ip2cpu_'+entry['name']+'_reg <= #1 cpu2ip_'+entry['name']+'_reg;');1593       moduleFile.write('		cpu_'+entry['name']+'_reg_clear_d <= #1    cpu_'+entry['name']+'_reg_clear;\n')1594  moduleFile.write('\1595        end\n\n')1596#end of write_module_template1597########################################################################################1598#1599# Main function body1600#1601########################################################################################1602# List of files to be generated.1603filename_regs=''+module_name+'_cpu_regs.v'1604filename_defs=''+module_name+'_cpu_regs_defines.v'1605filename_template=''+module_name+'_cpu_template.v'1606filename_h=''+module_name+'_regs_defines.h' 1607filename_tcl=''+module_name+'_regs_defines.tcl'1608filename_tb=''+module_name+'_regs_defines.txt'1609# Open the files for writing1610regsFile = open(filename_regs, 'w')1611defsFile = open(filename_defs, 'w')1612moduleFile = open(filename_template, 'w')1613hFile = open(filename_h, 'w')1614tclFile = open(filename_tcl, 'w')1615tbFile = open(filename_tb, 'w')1616# Write the header of each file1617write_regs_header(regsFile)1618write_defs_header(defsFile)1619write_tcl_header(tclFile)1620write_hFile_header(hFile)1621write_tbFile_header(tbFile)1622#Write the regs module1623#first the ports...1624regsDict=create_regs_list()1625memsDict=create_mems_list()1626write_regs_ports(regsFile,regsDict, memsDict)1627#then the wires...1628write_regs_wires(regsFile,regsDict, memsDict)1629#resets etc.....1630sync_reset(regsFile)1631#registers logic...1632write_logic(regsFile,regsDict)1633#indirect access...1634if memsDict:1635  write_indirect(regsFile,memsDict)1636#tables...1637#close module.....1638regsFile.write('endmodule\n')1639#write the defs module1640write_defines(defsFile,regsDict, memsDict)1641#write the tcl module1642write_tcl(tclFile,regsDict, memsDict)1643#write the default text to be copied to the h module1644write_h(hFile,regsDict, memsDict)1645#write the default text to table file1646write_tb(tbFile,regsDict, memsDict)1647#writes the default text to be copied to the top module1648write_module_template(moduleFile,regsDict, memsDict)1649# Close the output files1650regsFile.close()1651defsFile.close()1652tclFile.close()1653moduleFile.close()1654hFile.close()...FeedEntryViewer.js.uncompressed.js
Source:FeedEntryViewer.js.uncompressed.js  
1require({cache:{2'url:dojox/atom/widget/templates/EntryHeader.html':"<span dojoAttachPoint=\"entryHeaderNode\" class=\"entryHeaderNode\"></span>\n",3'url:dojox/atom/widget/templates/FeedEntryViewer.html':"<div class=\"feedEntryViewer\">\n    <table border=\"0\" width=\"100%\" class=\"feedEntryViewerMenuTable\" dojoAttachPoint=\"feedEntryViewerMenu\" style=\"display: none;\">\n        <tr width=\"100%\"  dojoAttachPoint=\"entryCheckBoxDisplayOptions\">\n            <td align=\"right\">\n                <span class=\"feedEntryViewerMenu\" dojoAttachPoint=\"displayOptions\" dojoAttachEvent=\"onclick:_toggleOptions\"></span>\n            </td>\n        </tr>\n        <tr class=\"feedEntryViewerDisplayCheckbox\" dojoAttachPoint=\"entryCheckBoxRow\" width=\"100%\" style=\"display: none;\">\n            <td dojoAttachPoint=\"feedEntryCelltitle\">\n                <input type=\"checkbox\" name=\"title\" value=\"Title\" dojoAttachPoint=\"feedEntryCheckBoxTitle\" dojoAttachEvent=\"onclick:_toggleCheckbox\"/>\n\t\t\t\t<label for=\"title\" dojoAttachPoint=\"feedEntryCheckBoxLabelTitle\"></label>\n            </td>\n            <td dojoAttachPoint=\"feedEntryCellauthors\">\n                <input type=\"checkbox\" name=\"authors\" value=\"Authors\" dojoAttachPoint=\"feedEntryCheckBoxAuthors\" dojoAttachEvent=\"onclick:_toggleCheckbox\"/>\n\t\t\t\t<label for=\"title\" dojoAttachPoint=\"feedEntryCheckBoxLabelAuthors\"></label>\n            </td>\n            <td dojoAttachPoint=\"feedEntryCellcontributors\">\n                <input type=\"checkbox\" name=\"contributors\" value=\"Contributors\" dojoAttachPoint=\"feedEntryCheckBoxContributors\" dojoAttachEvent=\"onclick:_toggleCheckbox\"/>\n\t\t\t\t<label for=\"title\" dojoAttachPoint=\"feedEntryCheckBoxLabelContributors\"></label>\n            </td>\n            <td dojoAttachPoint=\"feedEntryCellid\">\n                <input type=\"checkbox\" name=\"id\" value=\"Id\" dojoAttachPoint=\"feedEntryCheckBoxId\" dojoAttachEvent=\"onclick:_toggleCheckbox\"/>\n\t\t\t\t<label for=\"title\" dojoAttachPoint=\"feedEntryCheckBoxLabelId\"></label>\n            </td>\n            <td rowspan=\"2\" align=\"right\">\n                <span class=\"feedEntryViewerMenu\" dojoAttachPoint=\"close\" dojoAttachEvent=\"onclick:_toggleOptions\"></span>\n            </td>\n\t\t</tr>\n\t\t<tr class=\"feedEntryViewerDisplayCheckbox\" dojoAttachPoint=\"entryCheckBoxRow2\" width=\"100%\" style=\"display: none;\">\n            <td dojoAttachPoint=\"feedEntryCellupdated\">\n                <input type=\"checkbox\" name=\"updated\" value=\"Updated\" dojoAttachPoint=\"feedEntryCheckBoxUpdated\" dojoAttachEvent=\"onclick:_toggleCheckbox\"/>\n\t\t\t\t<label for=\"title\" dojoAttachPoint=\"feedEntryCheckBoxLabelUpdated\"></label>\n            </td>\n            <td dojoAttachPoint=\"feedEntryCellsummary\">\n                <input type=\"checkbox\" name=\"summary\" value=\"Summary\" dojoAttachPoint=\"feedEntryCheckBoxSummary\" dojoAttachEvent=\"onclick:_toggleCheckbox\"/>\n\t\t\t\t<label for=\"title\" dojoAttachPoint=\"feedEntryCheckBoxLabelSummary\"></label>\n            </td>\n            <td dojoAttachPoint=\"feedEntryCellcontent\">\n                <input type=\"checkbox\" name=\"content\" value=\"Content\" dojoAttachPoint=\"feedEntryCheckBoxContent\" dojoAttachEvent=\"onclick:_toggleCheckbox\"/>\n\t\t\t\t<label for=\"title\" dojoAttachPoint=\"feedEntryCheckBoxLabelContent\"></label>\n            </td>\n        </tr>\n    </table>\n    \n    <table class=\"feedEntryViewerContainer\" border=\"0\" width=\"100%\">\n        <tr class=\"feedEntryViewerTitle\" dojoAttachPoint=\"entryTitleRow\" style=\"display: none;\">\n            <td>\n                <table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\n                    <tr class=\"graphic-tab-lgray\">\n\t\t\t\t\t\t<td class=\"lp2\">\n\t\t\t\t\t\t\t<span class=\"lp\" dojoAttachPoint=\"entryTitleHeader\"></span>\n\t\t\t\t\t\t</td>\n                    </tr>\n                    <tr>\n                        <td dojoAttachPoint=\"entryTitleNode\">\n                        </td>\n                    </tr>\n                </table>\n            </td>\n        </tr>\n\n        <tr class=\"feedEntryViewerAuthor\" dojoAttachPoint=\"entryAuthorRow\" style=\"display: none;\">\n            <td>\n                <table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\n                    <tr class=\"graphic-tab-lgray\">\n\t\t\t\t\t\t<td class=\"lp2\">\n\t\t\t\t\t\t\t<span class=\"lp\" dojoAttachPoint=\"entryAuthorHeader\"></span>\n\t\t\t\t\t\t</td>\n                    </tr>\n                    <tr>\n                        <td dojoAttachPoint=\"entryAuthorNode\">\n                        </td>\n                    </tr>\n                </table>\n            </td>\n        </tr>\n\n        <tr class=\"feedEntryViewerContributor\" dojoAttachPoint=\"entryContributorRow\" style=\"display: none;\">\n            <td>\n                <table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\n                    <tr class=\"graphic-tab-lgray\">\n\t\t\t\t\t\t<td class=\"lp2\">\n\t\t\t\t\t\t\t<span class=\"lp\" dojoAttachPoint=\"entryContributorHeader\"></span>\n\t\t\t\t\t\t</td>\n                    </tr>\n                    <tr>\n                        <td dojoAttachPoint=\"entryContributorNode\" class=\"feedEntryViewerContributorNames\">\n                        </td>\n                    </tr>\n                </table>\n            </td>\n        </tr>\n        \n        <tr class=\"feedEntryViewerId\" dojoAttachPoint=\"entryIdRow\" style=\"display: none;\">\n            <td>\n                <table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\n                    <tr class=\"graphic-tab-lgray\">\n\t\t\t\t\t\t<td class=\"lp2\">\n\t\t\t\t\t\t\t<span class=\"lp\" dojoAttachPoint=\"entryIdHeader\"></span>\n\t\t\t\t\t\t</td>\n                    </tr>\n                    <tr>\n                        <td dojoAttachPoint=\"entryIdNode\" class=\"feedEntryViewerIdText\">\n                        </td>\n                    </tr>\n                </table>\n            </td>\n        </tr>\n    \n        <tr class=\"feedEntryViewerUpdated\" dojoAttachPoint=\"entryUpdatedRow\" style=\"display: none;\">\n            <td>\n                <table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\n                    <tr class=\"graphic-tab-lgray\">\n\t\t\t\t\t\t<td class=\"lp2\">\n\t\t\t\t\t\t\t<span class=\"lp\" dojoAttachPoint=\"entryUpdatedHeader\"></span>\n\t\t\t\t\t\t</td>\n                    </tr>\n                    <tr>\n                        <td dojoAttachPoint=\"entryUpdatedNode\" class=\"feedEntryViewerUpdatedText\">\n                        </td>\n                    </tr>\n                </table>\n            </td>\n        </tr>\n    \n        <tr class=\"feedEntryViewerSummary\" dojoAttachPoint=\"entrySummaryRow\" style=\"display: none;\">\n            <td>\n                <table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\n                    <tr class=\"graphic-tab-lgray\">\n\t\t\t\t\t\t<td class=\"lp2\">\n\t\t\t\t\t\t\t<span class=\"lp\" dojoAttachPoint=\"entrySummaryHeader\"></span>\n\t\t\t\t\t\t</td>\n                    </tr>\n                    <tr>\n                        <td dojoAttachPoint=\"entrySummaryNode\">\n                        </td>\n                    </tr>\n                </table>\n            </td>\n        </tr>\n    \n        <tr class=\"feedEntryViewerContent\" dojoAttachPoint=\"entryContentRow\" style=\"display: none;\">\n            <td>\n                <table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\n                    <tr class=\"graphic-tab-lgray\">\n\t\t\t\t\t\t<td class=\"lp2\">\n\t\t\t\t\t\t\t<span class=\"lp\" dojoAttachPoint=\"entryContentHeader\"></span>\n\t\t\t\t\t\t</td>\n                    </tr>\n                    <tr>\n                        <td dojoAttachPoint=\"entryContentNode\">\n                        </td>\n                    </tr>\n                </table>\n            </td>\n        </tr>\n    </table>\n</div>\n"}});4define("dojox/atom/widget/FeedEntryViewer", [5	"dojo/_base/kernel",6	"dojo/_base/connect",7	"dojo/_base/declare",8	"dojo/_base/fx",9	"dojo/_base/array",10	"dojo/dom-style",11	"dojo/dom-construct",12	"dijit/_Widget",13	"dijit/_Templated",14	"dijit/_Container",15	"dijit/layout/ContentPane",16	"../io/Connection",17	"dojo/text!./templates/FeedEntryViewer.html",18	"dojo/text!./templates/EntryHeader.html",19	"dojo/i18n!./nls/FeedEntryViewer"20], function (dojo, connect, declare, fx, arrayUtil, domStyle, domConstruct, _Widget, _Templated, _Container, ContentPane, Connection, template, headerTemplate, i18nViewer) {21dojo.experimental("dojox.atom.widget.FeedEntryViewer");22var FeedEntryViewer = declare("dojox.atom.widget.FeedEntryViewer", [_Widget, _Templated, _Container],{23	// summary:24	//		An ATOM feed entry editor for publishing updated ATOM entries, or viewing non-editable entries.25	entrySelectionTopic: "",	//The topic to listen on for entries to edit.26	_validEntryFields: {},		//The entry fields that were present on the entry and are being displayed.27								//This works in conjunction with what is selected to be displayed.28	displayEntrySections: "", //What current sections of the entries to display as a comma separated list.29	_displayEntrySections: null,30	31	//Control options for the display options menu.32	enableMenu: false,33	enableMenuFade: false,34	_optionButtonDisplayed: true,35	//Templates for the HTML rendering.  Need to figure these out better, admittedly.36	templateString: template,37	38	_entry: null, //The entry that is being viewed/edited.39	_feed: null, //The feed the entry came from.40	_editMode: false, //Flag denoting the state of the widget, in edit mode or not.41	42	postCreate: function(){43		if(this.entrySelectionTopic !== ""){44			this._subscriptions = [dojo.subscribe(this.entrySelectionTopic, this, "_handleEvent")];45		}46		var _nlsResources = i18nViewer;47		this.displayOptions.innerHTML = _nlsResources.displayOptions;48		this.feedEntryCheckBoxLabelTitle.innerHTML = _nlsResources.title;49		this.feedEntryCheckBoxLabelAuthors.innerHTML = _nlsResources.authors;50		this.feedEntryCheckBoxLabelContributors.innerHTML = _nlsResources.contributors;51		this.feedEntryCheckBoxLabelId.innerHTML = _nlsResources.id;52		this.close.innerHTML = _nlsResources.close;53		this.feedEntryCheckBoxLabelUpdated.innerHTML = _nlsResources.updated;54		this.feedEntryCheckBoxLabelSummary.innerHTML = _nlsResources.summary;55		this.feedEntryCheckBoxLabelContent.innerHTML = _nlsResources.content;56	},57	startup: function(){58		if(this.displayEntrySections === ""){59			this._displayEntrySections = ["title","authors","contributors","summary","content","id","updated"];60		}else{61			this._displayEntrySections = this.displayEntrySections.split(",");62		}63		this._setDisplaySectionsCheckboxes();64		if(this.enableMenu){65			domStyle.set(this.feedEntryViewerMenu, 'display', '');66			if(this.entryCheckBoxRow && this.entryCheckBoxRow2){67				if(this.enableMenuFade){68					fx.fadeOut({node: this.entryCheckBoxRow,duration: 250}).play();69					fx.fadeOut({node: this.entryCheckBoxRow2,duration: 250}).play();70				}71			}72		}73	},74	clear: function(){75		// summary:76		//		Function to clear the state of the widget.77		this.destroyDescendants();78		this._entry=null;79		this._feed=null;80		this.clearNodes();81	},82	83	clearNodes: function(){84		// summary:85		//		Function to clear all the display nodes for the ATOM entry from the viewer.86		arrayUtil.forEach([87			"entryTitleRow", "entryAuthorRow", "entryContributorRow", "entrySummaryRow", "entryContentRow",88			"entryIdRow", "entryUpdatedRow"89			], function(node){90				domStyle.set(this[node], "display", "none");91			}, this);92		arrayUtil.forEach([93			"entryTitleNode", "entryTitleHeader", "entryAuthorHeader", "entryContributorHeader",94			"entryContributorNode", "entrySummaryHeader", "entrySummaryNode", "entryContentHeader",95			"entryContentNode", "entryIdNode", "entryIdHeader", "entryUpdatedHeader", "entryUpdatedNode"96			], function(part){97				while(this[part].firstChild){98					domConstruct.destroy(this[part].firstChild);99				}100			}101		,this);102		103	},104	setEntry: function(/*object*/entry, /*object*/feed, /*boolean*/leaveMenuState){105		// summary:106		//		Function to set the current entry that is being edited.107		// entry:108		//		Instance of dojox.atom.io.model.Entry to display for reading/editing.109		this.clear();110		this._validEntryFields = {};111		this._entry = entry;112		this._feed = feed;113		if(entry !== null){114			// Handle the title.115			if(this.entryTitleHeader){116				this.setTitleHeader(this.entryTitleHeader, entry);117			}118			119			if(this.entryTitleNode){120				this.setTitle(this.entryTitleNode, this._editMode, entry);121			}122			if(this.entryAuthorHeader){123				this.setAuthorsHeader(this.entryAuthorHeader, entry);124			}125			if(this.entryAuthorNode){126				this.setAuthors(this.entryAuthorNode, this._editMode, entry);127			}128			129			if(this.entryContributorHeader){130				this.setContributorsHeader(this.entryContributorHeader, entry);131			}132			if(this.entryContributorNode){133				this.setContributors(this.entryContributorNode, this._editMode, entry);134			}135			if(this.entryIdHeader){136				this.setIdHeader(this.entryIdHeader, entry);137			}138			if(this.entryIdNode){139				this.setId(this.entryIdNode, this._editMode, entry);140			}141			if(this.entryUpdatedHeader){142				this.setUpdatedHeader(this.entryUpdatedHeader, entry);143			}144			if(this.entryUpdatedNode){145				this.setUpdated(this.entryUpdatedNode, this._editMode, entry);146			}147			if(this.entrySummaryHeader){148				this.setSummaryHeader(this.entrySummaryHeader, entry);149			}150			if(this.entrySummaryNode){151				this.setSummary(this.entrySummaryNode, this._editMode, entry);152			}153			if(this.entryContentHeader){154				this.setContentHeader(this.entryContentHeader, entry);155			}156			if(this.entryContentNode){157				this.setContent(this.entryContentNode, this._editMode, entry);158			}159		}160		this._displaySections();161	},162	setTitleHeader: function(/*DOMNode*/ titleHeaderNode, /*object*/entry){163		// summary:164		//		Function to set the contents of the title header node in the template to some value.165		// description:166		//		Function to set the contents of the title header node in the template to some value.167		//		This exists specifically so users can over-ride how the title data is filled out from an entry.168		// titleAnchorNode:169		//		The DOM node to attach the title data to.170		// editMode:171		//		Boolean to indicate if the display should be in edit mode or not.172		// entry:173		//		The Feed Entry to work with.174		if(entry.title && entry.title.value && entry.title.value !== null){175			var _nlsResources = i18nViewer;176			var titleHeader = new EntryHeader({title: _nlsResources.title});177			titleHeaderNode.appendChild(titleHeader.domNode);178		}179	},180	setTitle: function(titleAnchorNode, editMode, entry){181		// summary:182		//		Function to set the contents of the title node in the template to some value from the entry.183		// description:184		//		Function to set the contents of the title node in the template to some value from the entry.185		//		This exists specifically so users can over-ride how the title data is filled out from an entry.186		// titleAnchorNode:187		//		The DOM node to attach the title data to.188		// editMode:189		//		Boolean to indicate if the display should be in edit mode or not.190		// entry:191		//		The Feed Entry to work with.192		if(entry.title && entry.title.value && entry.title.value !== null){193			if(entry.title.type == "text"){194				var titleNode = document.createTextNode(entry.title.value);195				titleAnchorNode.appendChild(titleNode);196			}else{197				var titleViewNode = document.createElement("span");198				var titleView = new ContentPane({refreshOnShow: true, executeScripts: false}, titleViewNode);199				titleView.attr('content', entry.title.value);200				titleAnchorNode.appendChild(titleView.domNode);201			}202			this.setFieldValidity("title", true);203		}204	},205	setAuthorsHeader: function(/*DOMNode*/ authorHeaderNode, /*object*/entry){206		// summary:207		//		Function to set the title format for the authors section of the author row in the template to some value from the entry.208		// description:209		//		Function to set the title format for the authors section of the author row in the template to some value from the entry.210		//		This exists specifically so users can over-ride how the author data is filled out from an entry.211		// authorHeaderNode:212		//		The DOM node to attach the author section header data to.213		// entry:214		//		The Feed Entry to work with.215		if(entry.authors && entry.authors.length > 0){216			var _nlsResources = i18nViewer;217			var authorHeader = new EntryHeader({title: _nlsResources.authors});218			authorHeaderNode.appendChild(authorHeader.domNode);219		}220	},221	setAuthors: function(/*DOMNode*/ authorsAnchorNode, /*boolean*/editMode, /*object*/entry){222		// summary:223		//		Function to set the contents of the author node in the template to some value from the entry.224		// description:225		//		Function to set the contents of the author node in the template to some value from the entry.226		//		This exists specifically so users can over-ride how the title data is filled out from an entry.227		// authorsAnchorNode:228		//		The DOM node to attach the author data to.229		// editMode:230		//		Boolean to indicate if the display should be in edit mode or not.231		// entry:232		//		The Feed Entry to work with.233		authorsAnchorNode.innerHTML = "";234		if(entry.authors && entry.authors.length > 0){235			for(var i in entry.authors){236				if(entry.authors[i].name){237					var anchor = authorsAnchorNode;238					if(entry.authors[i].uri){239						var link = document.createElement("a");240						anchor.appendChild(link);241						link.href = entry.authors[i].uri;242						anchor = link;243					}244					var name = entry.authors[i].name;245					if(entry.authors[i].email){246						name = name + " (" + entry.authors[i].email + ")";247					}248					var authorNode = document.createTextNode(name);249					anchor.appendChild(authorNode);250					var breakNode = document.createElement("br");251					authorsAnchorNode.appendChild(breakNode);252					this.setFieldValidity("authors", true);253				}254			}255		}256	},257	setContributorsHeader: function(/*DOMNode*/ contributorsHeaderNode, /*object*/entry){258		// summary:259		//		Function to set the contents of the contributor header node in the template to some value from the entry.260		// description:261		//		Function to set the contents of the contributor header node in the template to some value from the entry.262		//		This exists specifically so users can over-ride how the title data is filled out from an entry.263		// contributorsHeaderNode:264		//		The DOM node to attach the contributor title to.265		// entry:266		//		The Feed Entry to work with.267		if(entry.contributors && entry.contributors.length > 0){268			var _nlsResources = i18nViewer;269			var contributorHeader = new EntryHeader({title: _nlsResources.contributors});270			contributorsHeaderNode.appendChild(contributorHeader.domNode);271		}272	},273	setContributors: function(/*DOMNode*/ contributorsAnchorNode, /*boolean*/editMode, /*object*/entry){274		// summary:275		//		Function to set the contents of the contributor node in the template to some value from the entry.276		// description:277		//		Function to set the contents of the contributor node in the template to some value from the entry.278		//		This exists specifically so users can over-ride how the title data is filled out from an entry.279		// contributorsAnchorNode:280		//		The DOM node to attach the contributor data to.281		// editMode:282		//		Boolean to indicate if the display should be in edit mode or not.283		// entry:284		//		The Feed Entry to work with.285		if(entry.contributors && entry.contributors.length > 0){286			for(var i in entry.contributors){287				var contributorNode = document.createTextNode(entry.contributors[i].name);288				contributorsAnchorNode.appendChild(contributorNode);289				var breakNode = document.createElement("br");290				contributorsAnchorNode.appendChild(breakNode);291				this.setFieldValidity("contributors", true);292			}293		}294	},295				 296	setIdHeader: function(/*DOMNode*/ idHeaderNode, /*object*/entry){297		// summary:298		//		Function to set the contents of the ID  node in the template to some value from the entry.299		// description:300		//		Function to set the contents of the ID node in the template to some value from the entry.301		//		This exists specifically so users can over-ride how the title data is filled out from an entry.302		// idAnchorNode:303		//		The DOM node to attach the ID data to.304		// entry:305		//		The Feed Entry to work with.306		if(entry.id && entry.id !== null){307			var _nlsResources = i18nViewer;308			var idHeader = new EntryHeader({title: _nlsResources.id});309			idHeaderNode.appendChild(idHeader.domNode);310		}311	},312	setId: function(/*DOMNode*/ idAnchorNode, /*boolean*/editMode, /*object*/entry){313		// summary:314		//		Function to set the contents of the ID  node in the template to some value from the entry.315		// description:316		//		Function to set the contents of the ID node in the template to some value from the entry.317		//		This exists specifically so users can over-ride how the title data is filled out from an entry.318		// idAnchorNode:319		//		The DOM node to attach the ID data to.320		// editMode:321		//		Boolean to indicate if the display should be in edit mode or not.322		// entry:323		//		The Feed Entry to work with.324		if(entry.id && entry.id !== null){325			var idNode = document.createTextNode(entry.id);326			idAnchorNode.appendChild(idNode);327			this.setFieldValidity("id", true);328		}329	},330	331	setUpdatedHeader: function(/*DOMNode*/ updatedHeaderNode, /*object*/entry){332		// summary:333		//		Function to set the contents of the updated header node in the template to some value from the entry.334		// description:335		//		Function to set the contents of the updated header node in the template to some value from the entry.336		//		This exists specifically so users can over-ride how the title data is filled out from an entry.337		// updatedHeaderNode:338		//		The DOM node to attach the updated header data to.339		// entry:340		//		The Feed Entry to work with.341		if(entry.updated && entry.updated !== null){342			var _nlsResources = i18nViewer;343			var updatedHeader = new EntryHeader({title: _nlsResources.updated});344			updatedHeaderNode.appendChild(updatedHeader.domNode);345		}346	},347	setUpdated: function(/*DOMNode*/ updatedAnchorNode, /*boolean*/editMode, /*object*/entry){348		// summary:349		//		Function to set the contents of the updated  node in the template to some value from the entry.350		// description:351		//		Function to set the contents of the updated node in the template to some value from the entry.352		//		This exists specifically so users can over-ride how the title data is filled out from an entry.353		// updatedAnchorNode:354		//		The DOM node to attach the udpated data to.355		// editMode:356		//		Boolean to indicate if the display should be in edit mode or not.357		// entry:358		//		The Feed Entry to work with.359		if(entry.updated && entry.updated !== null){360			var updatedNode = document.createTextNode(entry.updated);361			updatedAnchorNode.appendChild(updatedNode);362			this.setFieldValidity("updated", true);363		}364	},365	setSummaryHeader: function(/*DOMNode*/ summaryHeaderNode, /*object*/entry){366		// summary:367		//		Function to set the contents of the summary  node in the template to some value from the entry.368		// description:369		//		Function to set the contents of the summary node in the template to some value from the entry.370		//		This exists specifically so users can over-ride how the title data is filled out from an entry.371		// summaryHeaderNode:372		//		The DOM node to attach the summary title to.373		// entry:374		//		The Feed Entry to work with.375		if(entry.summary && entry.summary.value && entry.summary.value !== null){376			var _nlsResources = i18nViewer;377			var summaryHeader = new EntryHeader({title: _nlsResources.summary});378			summaryHeaderNode.appendChild(summaryHeader.domNode);379		}380	},381	setSummary: function(/*DOMNode*/ summaryAnchorNode, /*boolean*/editMode, /*object*/entry){382		// summary:383		//		Function to set the contents of the summary  node in the template to some value from the entry.384		// description:385		//		Function to set the contents of the summary node in the template to some value from the entry.386		//		This exists specifically so users can over-ride how the title data is filled out from an entry.387		// summaryAnchorNode:388		//		The DOM node to attach the summary data to.389		// editMode:390		//		Boolean to indicate if the display should be in edit mode or not.391		// entry:392		//		The Feed Entry to work with.393		if(entry.summary && entry.summary.value && entry.summary.value !== null){394			var summaryViewNode = document.createElement("span");395			var summaryView = new ContentPane({refreshOnShow: true, executeScripts: false}, summaryViewNode);396			summaryView.attr('content', entry.summary.value);397			summaryAnchorNode.appendChild(summaryView.domNode);398			this.setFieldValidity("summary", true);399		}400	},401	setContentHeader: function(/*DOMNode*/ contentHeaderNode, /*object*/entry){402		// summary:403		//		Function to set the contents of the content node in the template to some value from the entry.404		// description:405		//		Function to set the contents of the content node in the template to some value from the entry.406		//		This exists specifically so users can over-ride how the title data is filled out from an entry.407		// contentHeaderNode:408		//		The DOM node to attach the content data to.409		// entry:410		//		The Feed Entry to work with.411		if(entry.content && entry.content.value && entry.content.value !== null){412			var _nlsResources = i18nViewer;413			var contentHeader = new EntryHeader({title: _nlsResources.content});414			contentHeaderNode.appendChild(contentHeader.domNode);415		}416	},417	setContent: function(/*DOMNode*/ contentAnchorNode, /*boolean*/editMode, /*object*/entry){418		// summary:419		//		Function to set the contents of the content node in the template to some value from the entry.420		// description:421		//		Function to set the contents of the content node in the template to some value from the entry.422		//		This exists specifically so users can over-ride how the title data is filled out from an entry.423		// contentAnchorNode:424		//		The DOM node to attach the content data to.425		// editMode:426		//		Boolean to indicate if the display should be in edit mode or not.427		// entry:428		//		The Feed Entry to work with.429		if(entry.content && entry.content.value && entry.content.value !== null){430			var contentViewNode = document.createElement("span");431			var contentView = new ContentPane({refreshOnShow: true, executeScripts: false},contentViewNode);432			contentView.attr('content', entry.content.value);433			contentAnchorNode.appendChild(contentView.domNode);434			this.setFieldValidity("content", true);435		}436	},437	_displaySections: function(){438		// summary:439		//		Internal function for determining which sections of the view to actually display.440		// returns:441		//		Nothing.442		domStyle.set(this.entryTitleRow, 'display', 'none');443		domStyle.set(this.entryAuthorRow, 'display', 'none');444		domStyle.set(this.entryContributorRow, 'display', 'none');445		domStyle.set(this.entrySummaryRow, 'display', 'none');446		domStyle.set(this.entryContentRow, 'display', 'none');447		domStyle.set(this.entryIdRow, 'display', 'none');448		domStyle.set(this.entryUpdatedRow, 'display', 'none');449		for(var i in this._displayEntrySections){450			var section = this._displayEntrySections[i].toLowerCase();451			if(section === "title" && this.isFieldValid("title")){452				domStyle.set(this.entryTitleRow, 'display', '');453			}454			if(section === "authors" && this.isFieldValid("authors")){455				domStyle.set(this.entryAuthorRow, 'display', '');456			}457			if(section === "contributors" && this.isFieldValid("contributors")){458				domStyle.set(this.entryContributorRow, 'display', '');459			}460			if(section === "summary" && this.isFieldValid("summary")){461				domStyle.set(this.entrySummaryRow, 'display', '');462			}463			if(section === "content" && this.isFieldValid("content")){464				domStyle.set(this.entryContentRow, 'display', '');465			}466			if(section === "id" && this.isFieldValid("id")){467				domStyle.set(this.entryIdRow, 'display', '');468			}469			if(section === "updated" && this.isFieldValid("updated")){470				domStyle.set(this.entryUpdatedRow, 'display', '');471			}472		}473	},474	setDisplaySections: function(/*array*/sectionsArray){475		// summary:476		//		Function for setting which sections of the entry should be displayed.477		// sectionsArray:478		//		Array of string names that indicate which sections to display.479		// returns:480		//		Nothing.481		if(sectionsArray !== null){482			this._displayEntrySections = sectionsArray;483			this._displaySections();484		}else{485			this._displayEntrySections = ["title","authors","contributors","summary","content","id","updated"];486		}487	},488	_setDisplaySectionsCheckboxes: function(){489		// summary:490		//		Internal function for setting which checkboxes on the display are selected.491		// returns:492		//		Nothing.493		var items = ["title","authors","contributors","summary","content","id","updated"];494		for(var i in items){495			if(arrayUtil.indexOf(this._displayEntrySections, items[i]) == -1){496				domStyle.set(this["feedEntryCell"+items[i]], 'display', 'none');497			}else{498				this["feedEntryCheckBox"+items[i].substring(0,1).toUpperCase()+items[i].substring(1)].checked=true;499			}500		}501	},502	_readDisplaySections: function(){503		// summary:504		//		Internal function for reading what is currently checked for display and generating the display list from it.505		var checkedList = [];506		if(this.feedEntryCheckBoxTitle.checked){507			checkedList.push("title");508		}509		if(this.feedEntryCheckBoxAuthors.checked){510			checkedList.push("authors");511		}512		if(this.feedEntryCheckBoxContributors.checked){513			checkedList.push("contributors");514		}515		if(this.feedEntryCheckBoxSummary.checked){516			checkedList.push("summary");517		}518		if(this.feedEntryCheckBoxContent.checked){519			checkedList.push("content");520		}521		if(this.feedEntryCheckBoxId.checked){522			checkedList.push("id");523		}524		if(this.feedEntryCheckBoxUpdated.checked){525			checkedList.push("updated");526		}527		this._displayEntrySections = checkedList;528	},529	_toggleCheckbox: function(/*object*/checkBox){530		// summary:531		//		Internal function for determining of a particular entry is editable.532		// description:533		//		Internal function for determining of a particular entry is editable.534		//		This is used for determining if the delete action should be displayed or not.535		// checkBox:536		//		The checkbox object to toggle the selection on.537		if(checkBox.checked){538			checkBox.checked=false;539		}else{540			checkBox.checked=true;541		}542		this._readDisplaySections();543		this._displaySections();544	},545	_toggleOptions: function(/*object*/checkBox){546		// summary:547		//		Internal function for determining of a particular entry is editable.548		// description:549		//		Internal function for determining of a particular entry is editable.550		//		This is used for determining if the delete action should be displayed or not.551		// checkBox:552		//		The checkbox object to toggle the selection on.553		if(this.enableMenu){554			var fade = null;555			var anim;556			var anim2;557			if(this._optionButtonDisplayed){558				if(this.enableMenuFade){559					anim = fx.fadeOut({node: this.entryCheckBoxDisplayOptions,duration: 250});560					connect.connect(anim, "onEnd", this, function(){561						domStyle.set(this.entryCheckBoxDisplayOptions, 'display', 'none');562						domStyle.set(this.entryCheckBoxRow, 'display', '');563						domStyle.set(this.entryCheckBoxRow2, 'display', '');564						fx.fadeIn({node: this.entryCheckBoxRow, duration: 250}).play();565						fx.fadeIn({node: this.entryCheckBoxRow2, duration: 250}).play();566					});567					anim.play();568				}else{569					domStyle.set(this.entryCheckBoxDisplayOptions, 'display', 'none');570					domStyle.set(this.entryCheckBoxRow, 'display', '');571					domStyle.set(this.entryCheckBoxRow2, 'display', '');572				}573				this._optionButtonDisplayed=false;574			}else{575				if(this.enableMenuFade){576					anim = fx.fadeOut({node: this.entryCheckBoxRow,duration: 250});577					anim2 = fx.fadeOut({node: this.entryCheckBoxRow2,duration: 250});578					connect.connect(anim, "onEnd", this, function(){579						domStyle.set(this.entryCheckBoxRow, 'display', 'none');580						domStyle.set(this.entryCheckBoxRow2, 'display', 'none');581						domStyle.set(this.entryCheckBoxDisplayOptions, 'display', '');582						fx.fadeIn({node: this.entryCheckBoxDisplayOptions, duration: 250}).play();583					});584					anim.play();585					anim2.play();586				}else{587					domStyle.set(this.entryCheckBoxRow, 'display', 'none');588					domStyle.set(this.entryCheckBoxRow2, 'display', 'none');589					domStyle.set(this.entryCheckBoxDisplayOptions, 'display', '');590				}591				this._optionButtonDisplayed=true;592			}593		}594	},595	_handleEvent: function(/*object*/entrySelectionEvent){596		// summary:597		//		Internal function for listening to a topic that will handle entry notification.598		// entrySelectionEvent:599		//		The topic message containing the entry that was selected for view.600		// returns:601		//		Nothing.602		if(entrySelectionEvent.source != this){603			if(entrySelectionEvent.action == "set" && entrySelectionEvent.entry){604				this.setEntry(entrySelectionEvent.entry, entrySelectionEvent.feed);605			}else if(entrySelectionEvent.action == "delete" && entrySelectionEvent.entry && entrySelectionEvent.entry == this._entry){606				this.clear();607			}608		}609	},610	setFieldValidity: function(/*string*/field, /*boolean*/isValid){611		// summary:612		//		Function to set whether a field in the view is valid and displayable.613		// description:614		//		Function to set whether a field in the view is valid and displayable.615		//		This is needed for over-riding of the set* functions and customization of how data is displayed in the attach point.616		//		So if custom implementations use their own display logic, they can still enable the field.617		// field:618		//		The field name to set the valid parameter on.  Such as 'content', 'id', etc.619		// isValid:620		//		Flag denoting if the field is valid or not.621		// returns:622		//		Nothing.623		if(field){624			var lowerField = field.toLowerCase();625			this._validEntryFields[field] = isValid;626		}627	},628	629	isFieldValid: function(/*string*/field){630		// summary:631		//		Function to return if a displayable field is valid or not632		// field:633		//		The field name to get the valid parameter of.  Such as 'content', 'id', etc.634		// returns:635		//		boolean denoting if the field is valid and set.636		return this._validEntryFields[field.toLowerCase()];637	},638	getEntry: function(){639		return this._entry;640	},641	getFeed: function(){642		 return this._feed;643	},644	destroy: function(){645		this.clear();646		arrayUtil.forEach(this._subscriptions, dojo.unsubscribe);647	}648});649var EntryHeader = FeedEntryViewer.EntryHeader = declare("dojox.atom.widget.EntryHeader", [_Widget, _Templated, _Container],{650	// summary:651	//		Widget representing a header in a FeedEntryViewer/Editor652	title: "",653	templateString: headerTemplate,654	postCreate: function(){655		this.setListHeader();656	},657	setListHeader: function(/*string*/title){658		this.clear();659		if(title){660			this.title = title;661		}662		var textNode = document.createTextNode(this.title);663		this.entryHeaderNode.appendChild(textNode);664	},665	clear: function(){666		this.destroyDescendants();667		 if(this.entryHeaderNode){668			 for(var i = 0; i < this.entryHeaderNode.childNodes.length; i++){669				 this.entryHeaderNode.removeChild(this.entryHeaderNode.childNodes[i]);670			 }671		 }672	},673	destroy: function(){674		this.clear();675	}676});677return FeedEntryViewer;...FeedEntryViewer.js
Source:FeedEntryViewer.js  
1define([2	"dojo/_base/kernel",3	"dojo/_base/connect",4	"dojo/_base/declare",5	"dojo/_base/fx",6	"dojo/_base/array",7	"dojo/dom-style",8	"dojo/dom-construct",9	"dijit/_Widget",10	"dijit/_Templated",11	"dijit/_Container",12	"dijit/layout/ContentPane",13	"../io/Connection",14	"dojo/text!./templates/FeedEntryViewer.html",15	"dojo/text!./templates/EntryHeader.html",16	"dojo/i18n!./nls/FeedEntryViewer"17], function (dojo, connect, declare, fx, arrayUtil, domStyle, domConstruct, _Widget, _Templated, _Container, ContentPane, Connection, template, headerTemplate, i18nViewer) {18dojo.experimental("dojox.atom.widget.FeedEntryViewer");19var FeedEntryViewer = declare("dojox.atom.widget.FeedEntryViewer", [_Widget, _Templated, _Container],{20	// summary:21	//		An ATOM feed entry editor for publishing updated ATOM entries, or viewing non-editable entries.22	entrySelectionTopic: "",	//The topic to listen on for entries to edit.23	_validEntryFields: {},		//The entry fields that were present on the entry and are being displayed.24								//This works in conjunction with what is selected to be displayed.25	displayEntrySections: "", //What current sections of the entries to display as a comma separated list.26	_displayEntrySections: null,27	28	//Control options for the display options menu.29	enableMenu: false,30	enableMenuFade: false,31	_optionButtonDisplayed: true,32	//Templates for the HTML rendering.  Need to figure these out better, admittedly.33	templateString: template,34	35	_entry: null, //The entry that is being viewed/edited.36	_feed: null, //The feed the entry came from.37	_editMode: false, //Flag denoting the state of the widget, in edit mode or not.38	39	postCreate: function(){40		if(this.entrySelectionTopic !== ""){41			this._subscriptions = [dojo.subscribe(this.entrySelectionTopic, this, "_handleEvent")];42		}43		var _nlsResources = i18nViewer;44		this.displayOptions.innerHTML = _nlsResources.displayOptions;45		this.feedEntryCheckBoxLabelTitle.innerHTML = _nlsResources.title;46		this.feedEntryCheckBoxLabelAuthors.innerHTML = _nlsResources.authors;47		this.feedEntryCheckBoxLabelContributors.innerHTML = _nlsResources.contributors;48		this.feedEntryCheckBoxLabelId.innerHTML = _nlsResources.id;49		this.close.innerHTML = _nlsResources.close;50		this.feedEntryCheckBoxLabelUpdated.innerHTML = _nlsResources.updated;51		this.feedEntryCheckBoxLabelSummary.innerHTML = _nlsResources.summary;52		this.feedEntryCheckBoxLabelContent.innerHTML = _nlsResources.content;53	},54	startup: function(){55		if(this.displayEntrySections === ""){56			this._displayEntrySections = ["title","authors","contributors","summary","content","id","updated"];57		}else{58			this._displayEntrySections = this.displayEntrySections.split(",");59		}60		this._setDisplaySectionsCheckboxes();61		if(this.enableMenu){62			domStyle.set(this.feedEntryViewerMenu, 'display', '');63			if(this.entryCheckBoxRow && this.entryCheckBoxRow2){64				if(this.enableMenuFade){65					fx.fadeOut({node: this.entryCheckBoxRow,duration: 250}).play();66					fx.fadeOut({node: this.entryCheckBoxRow2,duration: 250}).play();67				}68			}69		}70	},71	clear: function(){72		// summary:73		//		Function to clear the state of the widget.74		this.destroyDescendants();75		this._entry=null;76		this._feed=null;77		this.clearNodes();78	},79	80	clearNodes: function(){81		// summary:82		//		Function to clear all the display nodes for the ATOM entry from the viewer.83		arrayUtil.forEach([84			"entryTitleRow", "entryAuthorRow", "entryContributorRow", "entrySummaryRow", "entryContentRow",85			"entryIdRow", "entryUpdatedRow"86			], function(node){87				domStyle.set(this[node], "display", "none");88			}, this);89		arrayUtil.forEach([90			"entryTitleNode", "entryTitleHeader", "entryAuthorHeader", "entryContributorHeader",91			"entryContributorNode", "entrySummaryHeader", "entrySummaryNode", "entryContentHeader",92			"entryContentNode", "entryIdNode", "entryIdHeader", "entryUpdatedHeader", "entryUpdatedNode"93			], function(part){94				while(this[part].firstChild){95					domConstruct.destroy(this[part].firstChild);96				}97			}98		,this);99		100	},101	setEntry: function(/*object*/entry, /*object*/feed, /*boolean*/leaveMenuState){102		// summary:103		//		Function to set the current entry that is being edited.104		// entry:105		//		Instance of dojox.atom.io.model.Entry to display for reading/editing.106		this.clear();107		this._validEntryFields = {};108		this._entry = entry;109		this._feed = feed;110		if(entry !== null){111			// Handle the title.112			if(this.entryTitleHeader){113				this.setTitleHeader(this.entryTitleHeader, entry);114			}115			116			if(this.entryTitleNode){117				this.setTitle(this.entryTitleNode, this._editMode, entry);118			}119			if(this.entryAuthorHeader){120				this.setAuthorsHeader(this.entryAuthorHeader, entry);121			}122			if(this.entryAuthorNode){123				this.setAuthors(this.entryAuthorNode, this._editMode, entry);124			}125			126			if(this.entryContributorHeader){127				this.setContributorsHeader(this.entryContributorHeader, entry);128			}129			if(this.entryContributorNode){130				this.setContributors(this.entryContributorNode, this._editMode, entry);131			}132			if(this.entryIdHeader){133				this.setIdHeader(this.entryIdHeader, entry);134			}135			if(this.entryIdNode){136				this.setId(this.entryIdNode, this._editMode, entry);137			}138			if(this.entryUpdatedHeader){139				this.setUpdatedHeader(this.entryUpdatedHeader, entry);140			}141			if(this.entryUpdatedNode){142				this.setUpdated(this.entryUpdatedNode, this._editMode, entry);143			}144			if(this.entrySummaryHeader){145				this.setSummaryHeader(this.entrySummaryHeader, entry);146			}147			if(this.entrySummaryNode){148				this.setSummary(this.entrySummaryNode, this._editMode, entry);149			}150			if(this.entryContentHeader){151				this.setContentHeader(this.entryContentHeader, entry);152			}153			if(this.entryContentNode){154				this.setContent(this.entryContentNode, this._editMode, entry);155			}156		}157		this._displaySections();158	},159	setTitleHeader: function(/*DOMNode*/ titleHeaderNode, /*object*/entry){160		// summary:161		//		Function to set the contents of the title header node in the template to some value.162		// description:163		//		Function to set the contents of the title header node in the template to some value.164		//		This exists specifically so users can over-ride how the title data is filled out from an entry.165		// titleAnchorNode:166		//		The DOM node to attach the title data to.167		// editMode:168		//		Boolean to indicate if the display should be in edit mode or not.169		// entry:170		//		The Feed Entry to work with.171		if(entry.title && entry.title.value && entry.title.value !== null){172			var _nlsResources = i18nViewer;173			var titleHeader = new EntryHeader({title: _nlsResources.title});174			titleHeaderNode.appendChild(titleHeader.domNode);175		}176	},177	setTitle: function(titleAnchorNode, editMode, entry){178		// summary:179		//		Function to set the contents of the title node in the template to some value from the entry.180		// description:181		//		Function to set the contents of the title node in the template to some value from the entry.182		//		This exists specifically so users can over-ride how the title data is filled out from an entry.183		// titleAnchorNode:184		//		The DOM node to attach the title data to.185		// editMode:186		//		Boolean to indicate if the display should be in edit mode or not.187		// entry:188		//		The Feed Entry to work with.189		if(entry.title && entry.title.value && entry.title.value !== null){190			if(entry.title.type == "text"){191				var titleNode = document.createTextNode(entry.title.value);192				titleAnchorNode.appendChild(titleNode);193			}else{194				var titleViewNode = document.createElement("span");195				var titleView = new ContentPane({refreshOnShow: true, executeScripts: false}, titleViewNode);196				titleView.attr('content', entry.title.value);197				titleAnchorNode.appendChild(titleView.domNode);198			}199			this.setFieldValidity("title", true);200		}201	},202	setAuthorsHeader: function(/*DOMNode*/ authorHeaderNode, /*object*/entry){203		// summary:204		//		Function to set the title format for the authors section of the author row in the template to some value from the entry.205		// description:206		//		Function to set the title format for the authors section of the author row in the template to some value from the entry.207		//		This exists specifically so users can over-ride how the author data is filled out from an entry.208		// authorHeaderNode:209		//		The DOM node to attach the author section header data to.210		// entry:211		//		The Feed Entry to work with.212		if(entry.authors && entry.authors.length > 0){213			var _nlsResources = i18nViewer;214			var authorHeader = new EntryHeader({title: _nlsResources.authors});215			authorHeaderNode.appendChild(authorHeader.domNode);216		}217	},218	setAuthors: function(/*DOMNode*/ authorsAnchorNode, /*boolean*/editMode, /*object*/entry){219		// summary:220		//		Function to set the contents of the author node in the template to some value from the entry.221		// description:222		//		Function to set the contents of the author node in the template to some value from the entry.223		//		This exists specifically so users can over-ride how the title data is filled out from an entry.224		// authorsAnchorNode:225		//		The DOM node to attach the author data to.226		// editMode:227		//		Boolean to indicate if the display should be in edit mode or not.228		// entry:229		//		The Feed Entry to work with.230		authorsAnchorNode.innerHTML = "";231		if(entry.authors && entry.authors.length > 0){232			for(var i in entry.authors){233				if(entry.authors[i].name){234					var anchor = authorsAnchorNode;235					if(entry.authors[i].uri){236						var link = document.createElement("a");237						anchor.appendChild(link);238						link.href = entry.authors[i].uri;239						anchor = link;240					}241					var name = entry.authors[i].name;242					if(entry.authors[i].email){243						name = name + " (" + entry.authors[i].email + ")";244					}245					var authorNode = document.createTextNode(name);246					anchor.appendChild(authorNode);247					var breakNode = document.createElement("br");248					authorsAnchorNode.appendChild(breakNode);249					this.setFieldValidity("authors", true);250				}251			}252		}253	},254	setContributorsHeader: function(/*DOMNode*/ contributorsHeaderNode, /*object*/entry){255		// summary:256		//		Function to set the contents of the contributor header node in the template to some value from the entry.257		// description:258		//		Function to set the contents of the contributor header node in the template to some value from the entry.259		//		This exists specifically so users can over-ride how the title data is filled out from an entry.260		// contributorsHeaderNode:261		//		The DOM node to attach the contributor title to.262		// entry:263		//		The Feed Entry to work with.264		if(entry.contributors && entry.contributors.length > 0){265			var _nlsResources = i18nViewer;266			var contributorHeader = new EntryHeader({title: _nlsResources.contributors});267			contributorsHeaderNode.appendChild(contributorHeader.domNode);268		}269	},270	setContributors: function(/*DOMNode*/ contributorsAnchorNode, /*boolean*/editMode, /*object*/entry){271		// summary:272		//		Function to set the contents of the contributor node in the template to some value from the entry.273		// description:274		//		Function to set the contents of the contributor node in the template to some value from the entry.275		//		This exists specifically so users can over-ride how the title data is filled out from an entry.276		// contributorsAnchorNode:277		//		The DOM node to attach the contributor data to.278		// editMode:279		//		Boolean to indicate if the display should be in edit mode or not.280		// entry:281		//		The Feed Entry to work with.282		if(entry.contributors && entry.contributors.length > 0){283			for(var i in entry.contributors){284				var contributorNode = document.createTextNode(entry.contributors[i].name);285				contributorsAnchorNode.appendChild(contributorNode);286				var breakNode = document.createElement("br");287				contributorsAnchorNode.appendChild(breakNode);288				this.setFieldValidity("contributors", true);289			}290		}291	},292				 293	setIdHeader: function(/*DOMNode*/ idHeaderNode, /*object*/entry){294		// summary:295		//		Function to set the contents of the ID  node in the template to some value from the entry.296		// description:297		//		Function to set the contents of the ID node in the template to some value from the entry.298		//		This exists specifically so users can over-ride how the title data is filled out from an entry.299		// idAnchorNode:300		//		The DOM node to attach the ID data to.301		// entry:302		//		The Feed Entry to work with.303		if(entry.id && entry.id !== null){304			var _nlsResources = i18nViewer;305			var idHeader = new EntryHeader({title: _nlsResources.id});306			idHeaderNode.appendChild(idHeader.domNode);307		}308	},309	setId: function(/*DOMNode*/ idAnchorNode, /*boolean*/editMode, /*object*/entry){310		// summary:311		//		Function to set the contents of the ID  node in the template to some value from the entry.312		// description:313		//		Function to set the contents of the ID node in the template to some value from the entry.314		//		This exists specifically so users can over-ride how the title data is filled out from an entry.315		// idAnchorNode:316		//		The DOM node to attach the ID data to.317		// editMode:318		//		Boolean to indicate if the display should be in edit mode or not.319		// entry:320		//		The Feed Entry to work with.321		if(entry.id && entry.id !== null){322			var idNode = document.createTextNode(entry.id);323			idAnchorNode.appendChild(idNode);324			this.setFieldValidity("id", true);325		}326	},327	328	setUpdatedHeader: function(/*DOMNode*/ updatedHeaderNode, /*object*/entry){329		// summary:330		//		Function to set the contents of the updated header node in the template to some value from the entry.331		// description:332		//		Function to set the contents of the updated header node in the template to some value from the entry.333		//		This exists specifically so users can over-ride how the title data is filled out from an entry.334		// updatedHeaderNode:335		//		The DOM node to attach the updated header data to.336		// entry:337		//		The Feed Entry to work with.338		if(entry.updated && entry.updated !== null){339			var _nlsResources = i18nViewer;340			var updatedHeader = new EntryHeader({title: _nlsResources.updated});341			updatedHeaderNode.appendChild(updatedHeader.domNode);342		}343	},344	setUpdated: function(/*DOMNode*/ updatedAnchorNode, /*boolean*/editMode, /*object*/entry){345		// summary:346		//		Function to set the contents of the updated  node in the template to some value from the entry.347		// description:348		//		Function to set the contents of the updated node in the template to some value from the entry.349		//		This exists specifically so users can over-ride how the title data is filled out from an entry.350		// updatedAnchorNode:351		//		The DOM node to attach the udpated data to.352		// editMode:353		//		Boolean to indicate if the display should be in edit mode or not.354		// entry:355		//		The Feed Entry to work with.356		if(entry.updated && entry.updated !== null){357			var updatedNode = document.createTextNode(entry.updated);358			updatedAnchorNode.appendChild(updatedNode);359			this.setFieldValidity("updated", true);360		}361	},362	setSummaryHeader: function(/*DOMNode*/ summaryHeaderNode, /*object*/entry){363		// summary:364		//		Function to set the contents of the summary  node in the template to some value from the entry.365		// description:366		//		Function to set the contents of the summary node in the template to some value from the entry.367		//		This exists specifically so users can over-ride how the title data is filled out from an entry.368		// summaryHeaderNode:369		//		The DOM node to attach the summary title to.370		// entry:371		//		The Feed Entry to work with.372		if(entry.summary && entry.summary.value && entry.summary.value !== null){373			var _nlsResources = i18nViewer;374			var summaryHeader = new EntryHeader({title: _nlsResources.summary});375			summaryHeaderNode.appendChild(summaryHeader.domNode);376		}377	},378	setSummary: function(/*DOMNode*/ summaryAnchorNode, /*boolean*/editMode, /*object*/entry){379		// summary:380		//		Function to set the contents of the summary  node in the template to some value from the entry.381		// description:382		//		Function to set the contents of the summary node in the template to some value from the entry.383		//		This exists specifically so users can over-ride how the title data is filled out from an entry.384		// summaryAnchorNode:385		//		The DOM node to attach the summary data to.386		// editMode:387		//		Boolean to indicate if the display should be in edit mode or not.388		// entry:389		//		The Feed Entry to work with.390		if(entry.summary && entry.summary.value && entry.summary.value !== null){391			var summaryViewNode = document.createElement("span");392			var summaryView = new ContentPane({refreshOnShow: true, executeScripts: false}, summaryViewNode);393			summaryView.attr('content', entry.summary.value);394			summaryAnchorNode.appendChild(summaryView.domNode);395			this.setFieldValidity("summary", true);396		}397	},398	setContentHeader: function(/*DOMNode*/ contentHeaderNode, /*object*/entry){399		// summary:400		//		Function to set the contents of the content node in the template to some value from the entry.401		// description:402		//		Function to set the contents of the content node in the template to some value from the entry.403		//		This exists specifically so users can over-ride how the title data is filled out from an entry.404		// contentHeaderNode:405		//		The DOM node to attach the content data to.406		// entry:407		//		The Feed Entry to work with.408		if(entry.content && entry.content.value && entry.content.value !== null){409			var _nlsResources = i18nViewer;410			var contentHeader = new EntryHeader({title: _nlsResources.content});411			contentHeaderNode.appendChild(contentHeader.domNode);412		}413	},414	setContent: function(/*DOMNode*/ contentAnchorNode, /*boolean*/editMode, /*object*/entry){415		// summary:416		//		Function to set the contents of the content node in the template to some value from the entry.417		// description:418		//		Function to set the contents of the content node in the template to some value from the entry.419		//		This exists specifically so users can over-ride how the title data is filled out from an entry.420		// contentAnchorNode:421		//		The DOM node to attach the content data to.422		// editMode:423		//		Boolean to indicate if the display should be in edit mode or not.424		// entry:425		//		The Feed Entry to work with.426		if(entry.content && entry.content.value && entry.content.value !== null){427			var contentViewNode = document.createElement("span");428			var contentView = new ContentPane({refreshOnShow: true, executeScripts: false},contentViewNode);429			contentView.attr('content', entry.content.value);430			contentAnchorNode.appendChild(contentView.domNode);431			this.setFieldValidity("content", true);432		}433	},434	_displaySections: function(){435		// summary:436		//		Internal function for determining which sections of the view to actually display.437		// returns:438		//		Nothing.439		domStyle.set(this.entryTitleRow, 'display', 'none');440		domStyle.set(this.entryAuthorRow, 'display', 'none');441		domStyle.set(this.entryContributorRow, 'display', 'none');442		domStyle.set(this.entrySummaryRow, 'display', 'none');443		domStyle.set(this.entryContentRow, 'display', 'none');444		domStyle.set(this.entryIdRow, 'display', 'none');445		domStyle.set(this.entryUpdatedRow, 'display', 'none');446		for(var i in this._displayEntrySections){447			var section = this._displayEntrySections[i].toLowerCase();448			if(section === "title" && this.isFieldValid("title")){449				domStyle.set(this.entryTitleRow, 'display', '');450			}451			if(section === "authors" && this.isFieldValid("authors")){452				domStyle.set(this.entryAuthorRow, 'display', '');453			}454			if(section === "contributors" && this.isFieldValid("contributors")){455				domStyle.set(this.entryContributorRow, 'display', '');456			}457			if(section === "summary" && this.isFieldValid("summary")){458				domStyle.set(this.entrySummaryRow, 'display', '');459			}460			if(section === "content" && this.isFieldValid("content")){461				domStyle.set(this.entryContentRow, 'display', '');462			}463			if(section === "id" && this.isFieldValid("id")){464				domStyle.set(this.entryIdRow, 'display', '');465			}466			if(section === "updated" && this.isFieldValid("updated")){467				domStyle.set(this.entryUpdatedRow, 'display', '');468			}469		}470	},471	setDisplaySections: function(/*array*/sectionsArray){472		// summary:473		//		Function for setting which sections of the entry should be displayed.474		// sectionsArray:475		//		Array of string names that indicate which sections to display.476		// returns:477		//		Nothing.478		if(sectionsArray !== null){479			this._displayEntrySections = sectionsArray;480			this._displaySections();481		}else{482			this._displayEntrySections = ["title","authors","contributors","summary","content","id","updated"];483		}484	},485	_setDisplaySectionsCheckboxes: function(){486		// summary:487		//		Internal function for setting which checkboxes on the display are selected.488		// returns:489		//		Nothing.490		var items = ["title","authors","contributors","summary","content","id","updated"];491		for(var i in items){492			if(arrayUtil.indexOf(this._displayEntrySections, items[i]) == -1){493				domStyle.set(this["feedEntryCell"+items[i]], 'display', 'none');494			}else{495				this["feedEntryCheckBox"+items[i].substring(0,1).toUpperCase()+items[i].substring(1)].checked=true;496			}497		}498	},499	_readDisplaySections: function(){500		// summary:501		//		Internal function for reading what is currently checked for display and generating the display list from it.502		var checkedList = [];503		if(this.feedEntryCheckBoxTitle.checked){504			checkedList.push("title");505		}506		if(this.feedEntryCheckBoxAuthors.checked){507			checkedList.push("authors");508		}509		if(this.feedEntryCheckBoxContributors.checked){510			checkedList.push("contributors");511		}512		if(this.feedEntryCheckBoxSummary.checked){513			checkedList.push("summary");514		}515		if(this.feedEntryCheckBoxContent.checked){516			checkedList.push("content");517		}518		if(this.feedEntryCheckBoxId.checked){519			checkedList.push("id");520		}521		if(this.feedEntryCheckBoxUpdated.checked){522			checkedList.push("updated");523		}524		this._displayEntrySections = checkedList;525	},526	_toggleCheckbox: function(/*object*/checkBox){527		// summary:528		//		Internal function for determining of a particular entry is editable.529		// description:530		//		Internal function for determining of a particular entry is editable.531		//		This is used for determining if the delete action should be displayed or not.532		// checkBox:533		//		The checkbox object to toggle the selection on.534		if(checkBox.checked){535			checkBox.checked=false;536		}else{537			checkBox.checked=true;538		}539		this._readDisplaySections();540		this._displaySections();541	},542	_toggleOptions: function(/*object*/checkBox){543		// summary:544		//		Internal function for determining of a particular entry is editable.545		// description:546		//		Internal function for determining of a particular entry is editable.547		//		This is used for determining if the delete action should be displayed or not.548		// checkBox:549		//		The checkbox object to toggle the selection on.550		if(this.enableMenu){551			var fade = null;552			var anim;553			var anim2;554			if(this._optionButtonDisplayed){555				if(this.enableMenuFade){556					anim = fx.fadeOut({node: this.entryCheckBoxDisplayOptions,duration: 250});557					connect.connect(anim, "onEnd", this, function(){558						domStyle.set(this.entryCheckBoxDisplayOptions, 'display', 'none');559						domStyle.set(this.entryCheckBoxRow, 'display', '');560						domStyle.set(this.entryCheckBoxRow2, 'display', '');561						fx.fadeIn({node: this.entryCheckBoxRow, duration: 250}).play();562						fx.fadeIn({node: this.entryCheckBoxRow2, duration: 250}).play();563					});564					anim.play();565				}else{566					domStyle.set(this.entryCheckBoxDisplayOptions, 'display', 'none');567					domStyle.set(this.entryCheckBoxRow, 'display', '');568					domStyle.set(this.entryCheckBoxRow2, 'display', '');569				}570				this._optionButtonDisplayed=false;571			}else{572				if(this.enableMenuFade){573					anim = fx.fadeOut({node: this.entryCheckBoxRow,duration: 250});574					anim2 = fx.fadeOut({node: this.entryCheckBoxRow2,duration: 250});575					connect.connect(anim, "onEnd", this, function(){576						domStyle.set(this.entryCheckBoxRow, 'display', 'none');577						domStyle.set(this.entryCheckBoxRow2, 'display', 'none');578						domStyle.set(this.entryCheckBoxDisplayOptions, 'display', '');579						fx.fadeIn({node: this.entryCheckBoxDisplayOptions, duration: 250}).play();580					});581					anim.play();582					anim2.play();583				}else{584					domStyle.set(this.entryCheckBoxRow, 'display', 'none');585					domStyle.set(this.entryCheckBoxRow2, 'display', 'none');586					domStyle.set(this.entryCheckBoxDisplayOptions, 'display', '');587				}588				this._optionButtonDisplayed=true;589			}590		}591	},592	_handleEvent: function(/*object*/entrySelectionEvent){593		// summary:594		//		Internal function for listening to a topic that will handle entry notification.595		// entrySelectionEvent:596		//		The topic message containing the entry that was selected for view.597		// returns:598		//		Nothing.599		if(entrySelectionEvent.source != this){600			if(entrySelectionEvent.action == "set" && entrySelectionEvent.entry){601				this.setEntry(entrySelectionEvent.entry, entrySelectionEvent.feed);602			}else if(entrySelectionEvent.action == "delete" && entrySelectionEvent.entry && entrySelectionEvent.entry == this._entry){603				this.clear();604			}605		}606	},607	setFieldValidity: function(/*string*/field, /*boolean*/isValid){608		// summary:609		//		Function to set whether a field in the view is valid and displayable.610		// description:611		//		Function to set whether a field in the view is valid and displayable.612		//		This is needed for over-riding of the set* functions and customization of how data is displayed in the attach point.613		//		So if custom implementations use their own display logic, they can still enable the field.614		// field:615		//		The field name to set the valid parameter on.  Such as 'content', 'id', etc.616		// isValid:617		//		Flag denoting if the field is valid or not.618		// returns:619		//		Nothing.620		if(field){621			var lowerField = field.toLowerCase();622			this._validEntryFields[field] = isValid;623		}624	},625	626	isFieldValid: function(/*string*/field){627		// summary:628		//		Function to return if a displayable field is valid or not629		// field:630		//		The field name to get the valid parameter of.  Such as 'content', 'id', etc.631		// returns:632		//		boolean denoting if the field is valid and set.633		return this._validEntryFields[field.toLowerCase()];634	},635	getEntry: function(){636		return this._entry;637	},638	getFeed: function(){639		 return this._feed;640	},641	destroy: function(){642		this.clear();643		arrayUtil.forEach(this._subscriptions, dojo.unsubscribe);644	}645});646var EntryHeader = FeedEntryViewer.EntryHeader = declare("dojox.atom.widget.EntryHeader", [_Widget, _Templated, _Container],{647	// summary:648	//		Widget representing a header in a FeedEntryViewer/Editor649	title: "",650	templateString: headerTemplate,651	postCreate: function(){652		this.setListHeader();653	},654	setListHeader: function(/*string*/title){655		this.clear();656		if(title){657			this.title = title;658		}659		var textNode = document.createTextNode(this.title);660		this.entryHeaderNode.appendChild(textNode);661	},662	clear: function(){663		this.destroyDescendants();664		 if(this.entryHeaderNode){665			 for(var i = 0; i < this.entryHeaderNode.childNodes.length; i++){666				 this.entryHeaderNode.removeChild(this.entryHeaderNode.childNodes[i]);667			 }668		 }669	},670	destroy: function(){671		this.clear();672	}673});674return FeedEntryViewer;...views.py
Source:views.py  
1from django.shortcuts import render2from rest_framework import viewsets, status3from rest_framework.response import Response4from .models import Entry, Participant, Result, Survey_result5from .serializers import EntryQuesSerializer, ParticipantSerializer, EntryYesSerializer, EntryNoSerializer, \6    ResultSerializer, SurveySerializer7import random8from rest_framework.decorators import action9from django.db.models import F10class ResultViewSet(viewsets.ModelViewSet):11    queryset = Result.objects.all()12    serializer_class = ResultSerializer13    @action(detail=False, methods=['POST'])14    def post_answer_training(self, request):15        participant = Participant.objects.get(participant_id=request.data['id'])16        entry = Entry.objects.get(id=request.data['question'])17        Result.objects.create(worker_id=participant, user_points=request.data['score'], agent_points=0,18                              bought_information=request.data['yes_no'], round_num=request.data['round'],19                              training_question=True, entry_id=entry, buy_info_decision_time=0)20        participant.training_round = participant.training_round + 121        participant.save()22        return Response("result created", status=status.HTTP_200_OK)23    @action(detail=False, methods=['POST'])24    def post_answer_game(self, request):25        participant = Participant.objects.get(participant_id=request.data['id'])26        entry = Entry.objects.get(id=request.data['question'])27        entry.used_count = entry.used_count + 128        entry.save()29        Result.objects.create(worker_id=participant, user_points=request.data['score'], agent_points=0,30                              bought_information=request.data['yes_no'], round_num=request.data['round'],31                              training_question=False, entry_id=entry, buy_info_decision_time=0)32        participant.game_round = participant.game_round + 133        participant.save()34        return Response("result created", status=status.HTTP_200_OK)35class EntryViewSet(viewsets.ModelViewSet):36    queryset = Entry.objects.all()37    serializer_class = EntryQuesSerializer38    @action(detail=False, methods=['POST'])39    def get_another_game_ent(self, request):40        participant = Participant.objects.get(participant_id=request.data['id'])41        if participant.game_round > 20:42            return Response(False, status=status.HTTP_200_OK)43        ent_obj = Entry.objects.filter(used_count__lte=1)44        random_ent = random.sample(list(ent_obj), 1)45        serializer = EntryQuesSerializer(random_ent, many=True)46        serializer.data[0]['round'] = participant.game_round47        return Response(serializer.data[0], status=status.HTTP_200_OK)48    @action(detail=False, methods=['POST'])49    def get_another_training_ent(self, request):50        participant = Participant.objects.get(participant_id=request.data['id'])51        if participant.training_round == 1:52            ent_obj = Entry.objects.filter(sold_with__gt=F('z') * F('voi') + F('sold_without'))53            random_ent = random.sample(list(ent_obj), 1)54            serializer = EntryQuesSerializer(random_ent, many=True)55            serializer.data[0]['round'] = 156            return Response(serializer.data[0], status=status.HTTP_200_OK)57        if participant.training_round == 2:58            ent_obj = Entry.objects.filter(sold_with__lt=F('sold_without'))59            random_ent = random.sample(list(ent_obj), 1)60            serializer = EntryQuesSerializer(random_ent, many=True)61            serializer.data[0]['round'] = 262            return Response(serializer.data[0], status=status.HTTP_200_OK)63        ent_obj = Entry.objects.all()64        random_ent = random.sample(list(ent_obj), 1)65        serializer = EntryQuesSerializer(random_ent, many=True)66        serializer.data[0]['round'] = participant.training_round67        return Response(serializer.data[0], status=status.HTTP_200_OK)68    @action(detail=False, methods=['GET'])69    def get_first(self, request):70        ent_obj = Entry.objects.filter(sold_with__gt=F('z') * F('voi') + F('sold_without'))71        random_ent = random.sample(list(ent_obj), 1)72        serializer = EntryQuesSerializer(random_ent, many=True)73        return Response(serializer.data[0], status=status.HTTP_200_OK)74    @action(detail=False, methods=['GET'])75    def get_second(self, request):76        ent_obj = Entry.objects.filter(sold_with__lt=F('sold_without'))77        random_ent = random.sample(list(ent_obj), 1)78        serializer = EntryQuesSerializer(random_ent, many=True)79        return Response(serializer.data[0], status=status.HTTP_200_OK)80class EntryYesViewSet(viewsets.ModelViewSet):81    queryset = Entry.objects.all()82    serializer_class = EntryYesSerializer83    @action(detail=False, methods=['POST'])84    def get_bidders(self, request):85        entry = Entry.objects.get(id=request.data['id'])86        entrys_sum = []87        if entry.s == 1:88            entrys_sum = [entry.v11, entry.v21, entry.v31, entry.v41, entry.v51]89        if entry.s == 2:90            entrys_sum = [entry.v12, entry.v22, entry.v32, entry.v42, entry.v52]91        if entry.s == 3:92            entrys_sum = [entry.v13, entry.v23, entry.v33, entry.v43, entry.v53]93        if entry.s == 4:94            entrys_sum = [entry.v14, entry.v24, entry.v34, entry.v44, entry.v54]95        if entry.s == 5:96            entrys_sum = [entry.v15, entry.v25, entry.v35, entry.v45, entry.v55]97        if entry.s == 6:98            entrys_sum = [entry.v16, entry.v26, entry.v36, entry.v46, entry.v56]99        if entry.s == 7:100            entrys_sum = [entry.v17, entry.v27, entry.v37, entry.v47, entry.v57]101        entrys_count = [0, 0, 0, 0, 0]102        for i in range(1, entry.y + 1):103            if i == entry.n1:104                entrys_count[i - 1] = entrys_count[i - 1] + 1105            if i == entry.n2:106                entrys_count[i - 1] = entrys_count[i - 1] + 1107            if i == entry.n3:108                entrys_count[i - 1] = entrys_count[i - 1] + 1109            if i == entry.n4:110                entrys_count[i - 1] = entrys_count[i - 1] + 1111            if i == entry.n5:112                entrys_count[i - 1] = entrys_count[i - 1] + 1113            if i == entry.n6:114                entrys_count[i - 1] = entrys_count[i - 1] + 1115            if i == entry.n7:116                entrys_count[i - 1] = entrys_count[i - 1] + 1117            if i == entry.n8:118                entrys_count[i - 1] = entrys_count[i - 1] + 1119        type_json = {'t1': entrys_count[0], 't2': entrys_count[1], 't3': entrys_count[2], 't4': entrys_count[3],120                     't5': entrys_count[4], 't1_bid': entrys_sum[0], 't2_bid': entrys_sum[1], 't3_bid': entrys_sum[2],121                     't4_bid': entrys_sum[3], 't5_bid': entrys_sum[4]}122        return Response(type_json, status=status.HTTP_200_OK)123    @action(detail=False, methods=['POST'])124    def get_yes(self, request):125        entry = Entry.objects.get(id=request.data['question'])126        serializer = EntryYesSerializer(entry, many=False)127        return Response(serializer.data, status=status.HTTP_200_OK)128class EntryNoViewSet(viewsets.ModelViewSet):129    queryset = Entry.objects.all()130    serializer_class = EntryNoSerializer131    @action(detail=False, methods=['POST'])132    def get_bidders(self, request):133        entry = Entry.objects.get(id=request.data['id'])134        entrys_sum = [0, 0, 0, 0, 0]135        entrys_count = [0, 0, 0, 0, 0]136        if entry.n1 == 1:137            entrys_count[0] = entrys_count[0] + 1138            entrys_sum[0] = entry.n1_without139        if entry.n1 == 2:140            entrys_count[1] = entrys_count[1] + 1141            entrys_sum[1] = entry.n1_without142        if entry.n1 == 3:143            entrys_count[2] = entrys_count[2] + 1144            entrys_sum[2] = entry.n1_without145        if entry.n1 == 4:146            entrys_count[3] = entrys_count[3] + 1147            entrys_sum[3] = entry.n1_without148        if entry.n1 == 5:149            entrys_count[4] = entrys_count[4] + 1150            entrys_sum[4] = entry.n1_without151        if entry.n2 == 1:152            entrys_count[0] = entrys_count[0] + 1153            entrys_sum[0] = entry.n2_without154        if entry.n2 == 2:155            entrys_count[1] = entrys_count[1] + 1156            entrys_sum[1] = entry.n2_without157        if entry.n2 == 3:158            entrys_count[2] = entrys_count[2] + 1159            entrys_sum[2] = entry.n2_without160        if entry.n2 == 4:161            entrys_count[3] = entrys_count[3] + 1162            entrys_sum[3] = entry.n2_without163        if entry.n2 == 5:164            entrys_count[4] = entrys_count[4] + 1165            entrys_sum[4] = entry.n2_without166        if entry.n3 == 1:167            entrys_count[0] = entrys_count[0] + 1168            entrys_sum[0] = entry.n3_without169        if entry.n3 == 2:170            entrys_count[1] = entrys_count[1] + 1171            entrys_sum[1] = entry.n3_without172        if entry.n3 == 3:173            entrys_count[2] = entrys_count[2] + 1174            entrys_sum[2] = entry.n3_without175        if entry.n3 == 4:176            entrys_count[3] = entrys_count[3] + 1177            entrys_sum[3] = entry.n3_without178        if entry.n3 == 5:179            entrys_count[4] = entrys_count[4] + 1180            entrys_sum[4] = entry.n3_without181        if entry.n4 == 1:182            entrys_count[0] = entrys_count[0] + 1183            entrys_sum[0] = entry.n4_without184        if entry.n4 == 2:185            entrys_count[1] = entrys_count[1] + 1186            entrys_sum[1] = entry.n4_without187        if entry.n4 == 3:188            entrys_count[2] = entrys_count[2] + 1189            entrys_sum[2] = entry.n4_without190        if entry.n4 == 4:191            entrys_count[3] = entrys_count[3] + 1192            entrys_sum[3] = entry.n4_without193        if entry.n4 == 5:194            entrys_count[4] = entrys_count[4] + 1195            entrys_sum[4] = entry.n4_without196        if entry.n5 == 1:197            entrys_count[0] = entrys_count[0] + 1198            entrys_sum[0] = entry.n5_without199        if entry.n5 == 2:200            entrys_count[1] = entrys_count[1] + 1201            entrys_sum[1] = entry.n5_without202        if entry.n5 == 3:203            entrys_count[2] = entrys_count[2] + 1204            entrys_sum[2] = entry.n5_without205        if entry.n5 == 4:206            entrys_count[3] = entrys_count[3] + 1207            entrys_sum[3] = entry.n5_without208        if entry.n5 == 5:209            entrys_count[4] = entrys_count[4] + 1210            entrys_sum[4] = entry.n5_without211        if entry.n6 == 1:212            entrys_count[0] = entrys_count[0] + 1213            entrys_sum[0] = entry.n6_without214        if entry.n6 == 2:215            entrys_count[1] = entrys_count[1] + 1216            entrys_sum[1] = entry.n6_without217        if entry.n6 == 3:218            entrys_count[2] = entrys_count[2] + 1219            entrys_sum[2] = entry.n6_without220        if entry.n6 == 4:221            entrys_count[3] = entrys_count[3] + 1222            entrys_sum[3] = entry.n6_without223        if entry.n6 == 5:224            entrys_count[4] = entrys_count[4] + 1225            entrys_sum[4] = entry.n6_without226        if entry.n7 == 1:227            entrys_count[0] = entrys_count[0] + 1228            entrys_sum[0] = entry.n7_without229        if entry.n7 == 2:230            entrys_count[1] = entrys_count[1] + 1231            entrys_sum[1] = entry.n7_without232        if entry.n7 == 3:233            entrys_count[2] = entrys_count[2] + 1234            entrys_sum[2] = entry.n7_without235        if entry.n7 == 4:236            entrys_count[3] = entrys_count[3] + 1237            entrys_sum[3] = entry.n7_without238        if entry.n7 == 5:239            entrys_count[4] = entrys_count[4] + 1240            entrys_sum[4] = entry.n7_without241        if entry.n8 == 1:242            entrys_count[0] = entrys_count[0] + 1243            entrys_sum[0] = entry.n8_without244        if entry.n8 == 2:245            entrys_count[1] = entrys_count[1] + 1246            entrys_sum[1] = entry.n8_without247        if entry.n8 == 3:248            entrys_count[2] = entrys_count[2] + 1249            entrys_sum[2] = entry.n8_without250        if entry.n8 == 4:251            entrys_count[3] = entrys_count[3] + 1252            entrys_sum[3] = entry.n8_without253        if entry.n8 == 5:254            entrys_count[4] = entrys_count[4] + 1255            entrys_sum[4] = entry.n8_without256        type_json = {'t1': entrys_count[0], 't2': entrys_count[1], 't3': entrys_count[2], 't4': entrys_count[3],257                     't5': entrys_count[4], 't1_bid': entrys_sum[0], 't2_bid': entrys_sum[1], 't3_bid': entrys_sum[2],258                     't4_bid': entrys_sum[3], 't5_bid': entrys_sum[4]}259        return Response(type_json, status=status.HTTP_200_OK)260    @action(detail=False, methods=['POST'])261    def get_no(self, request):262        entry = Entry.objects.get(id=request.data['question'])263        serializer = EntryNoSerializer(entry, many=False)264        return Response(serializer.data, status=status.HTTP_200_OK)265class ParticipantViewSet(viewsets.ModelViewSet):266    queryset = Participant.objects.all()267    serializer_class = ParticipantSerializer268    @action(detail=False, methods=['POST'])269    def add_participant(self, request):270        participant = Participant.objects.create(age=request.data['age'], gender=request.data['gender'],271                                                 education=request.data['education'],272                                                 nationality=request.data['nationality'], instructions_time="-1",273                                                 training_time="-1",274                                                 game_time="-1", bonus=0, bonus_payed=False, HITId="-1",275                                                 AssignmentId="-1",276                                                 round_pass_instructions=1, instructions_score=0)277        return Response(participant.participant_id, status=status.HTTP_200_OK)278    @action(detail=False, methods=['POST'])279    def is_participant(self, request):280        try:281            participant = Participant.objects.get(participant_id=request.data['id'])282            if participant.round_pass_instructions > 3:283                return Response(False, status=status.HTTP_200_OK)284            return Response(True, status=status.HTTP_200_OK)285        except Participant.DoesNotExist:286            return Response(False, status=status.HTTP_200_OK)287    @action(detail=False, methods=['POST'])288    def pass_instructions(self, request):289        try:290            participant = Participant.objects.get(participant_id=request.data['id'])291            if participant.round_pass_instructions > 3 or participant.instructions_score < 7:292                return Response(False, status=status.HTTP_200_OK)293            return Response(True, status=status.HTTP_200_OK)294        except Participant.DoesNotExist:295            return Response(False, status=status.HTTP_200_OK)296    @action(detail=False, methods=['POST'])297    def update_score(self, request):298        participant = Participant.objects.get(participant_id=request.data['id'])299        participant.instructions_score = request.data['score']300        participant.instructions_time = request.data['time']301        if request.data['score'] < 7:302            participant.round_pass_instructions = participant.round_pass_instructions + 1303        participant.save()304        if participant.round_pass_instructions > 3:305            return Response(False, status=status.HTTP_200_OK)306        return Response(True, status=status.HTTP_200_OK)307    @action(detail=False, methods=['POST'])308    def get_round(self, request):309        participant = Participant.objects.get(participant_id=request.data['id'])310        return Response(participant.training_round, status=status.HTTP_200_OK)311    @action(detail=False, methods=['POST'])312    def get_round_game(self, request):313        participant = Participant.objects.get(participant_id=request.data['id'])314        return Response(participant.game_round, status=status.HTTP_200_OK)315class SurveyViewSet(viewsets.ModelViewSet):316    queryset = Survey_result.objects.all()317    serializer_class = SurveySerializer318    @action(detail=False, methods=['POST'])319    def add_survey(self, request):320        participant = Participant.objects.get(participant_id=request.data['id'])321        survey1 = Survey_result.objects.create(answer=request.data['q1'],322                                               question='Overall, how satisfied were you with this HIT?',323                                               worker_id=participant)324        survey2 = Survey_result.objects.create(answer=request.data['q2'],325                                               question='What was your attention span when you did the HIT?',326                                               worker_id=participant)327        survey3 = Survey_result.objects.create(answer=request.data['q3'],328                                               question='Are you happy with the bonus?(2$)', worker_id=participant)329        survey4 = Survey_result.objects.create(answer=request.data['q4'],330                                               question='Do you have any comments?', worker_id=participant)...Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
