To solve this optimization problem, we first need to define the decision variables, objective function, and constraints based on the given information.

Let's denote:
- \(x_p\) as the number of phones produced,
- \(x_l\) as the number of laptops produced.

The objective is to maximize profit. The profit per phone is $300, and the profit per laptop is $500. Therefore, the objective function can be written as:
\[ \text{Maximize:} \quad 300x_p + 500x_l \]

Now, let's outline the constraints:

1. **Silicon Chip Availability Constraint**: Each phone requires 2 silicon chips, and each laptop requires 4 silicon chips. The company can buy 200 silicon chips per week.
\[ 2x_p + 4x_l \leq 200 \]

2. **Engineering Time Constraint**: Each phone requires 5 hours of engineering time, and each laptop requires 6 hours. There are 250 hours available.
\[ 5x_p + 6x_l \leq 250 \]

3. **Assembly Time Constraint**: Each phone requires 3 hours of assembly time, and each laptop requires 1 hour. There are 300 hours available.
\[ 3x_p + 1x_l \leq 300 \]

4. **Minimum Production Constraints**:
   - At least 30 phones must be produced: \( x_p \geq 30 \)
   - At least 30 laptops must be produced: \( x_l \geq 30 \)

5. **Non-Negativity Constraints**: Since the number of items cannot be negative, we have:
   - \( x_p \geq 0 \)
   - \( x_l \geq 0 \)

Given these constraints and the objective function, we can formulate this problem as a linear programming (LP) problem.

Here's how you could implement this in Gurobi using Python:

```python
from gurobipy import *

# Create a new model
m = Model("TechCompanyProfit")

# Define variables
x_p = m.addVar(lb=30, vtype=GRB.CONTINUOUS, name="phones_produced")
x_l = m.addVar(lb=30, vtype=GRB.CONTINUOUS, name="laptops_produced")

# Objective function: Maximize profit
m.setObjective(300*x_p + 500*x_l, GRB.MAXIMIZE)

# Constraints
m.addConstr(2*x_p + 4*x_l <= 200, "silicon_chip_availability")
m.addConstr(5*x_p + 6*x_l <= 250, "engineering_time")
m.addConstr(3*x_p + x_l <= 300, "assembly_time")

# Optimize model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Phones produced: {x_p.x}")
    print(f"Laptops produced: {x_l.x}")
    print(f"Maximum profit: ${300*x_p.x + 500*x_l.x:.2f}")
else:
    print("No optimal solution found")
```